почему я не могу получить доступ к своей функции DLL - PullRequest
0 голосов
/ 20 июня 2010

Я пытаюсь загрузить DLL динамически, используя LoadLibrary(), что работает, однако я не могу получить адрес функции в той DLL, которую пытаюсь вызвать.

Функция DLL:(в файле CPP)

_declspec(dllexport) void MyDllFunc()
{
    printf("Hello from DLL");
}

Телефонный код:

typedef void (*MyDllFuncPtr)();

int _tmain(int argc, _TCHAR* argv[])
{

    HINSTANCE LoadMe;
    LPCWSTR str = L"C:\\Users\\Tony\\Documents\\Visual Studio 2008\\Projects\\DLL Loading\\Release\\MyDll.dll";

    LoadMe = LoadLibrary(str);

    if(LoadMe != 0)
        printf("Successfully Loaded!\r\n");
    else
        printf("Loading Failed \r\n" );


    MyDllFuncPtr func;

    func = (MyDllFuncPtr)GetProcAddress(LoadMe, "MyDllFunc");

    if (func != NULL)
        func();

    FreeLibrary(LoadMe);

}

func возвращает NULL !!!

Что я делаю не так?

Это проект консоли Win32.

Ответы [ 4 ]

3 голосов
/ 20 июня 2010

Запись

extern "C" _declspec(dllexport) void MyDllFunc()
1 голос
/ 20 июня 2010

Имена экспортируемых функций имеют оформление при использовании __declspec (dllexport) , вы можете уменьшить оформление, используя extern "C" , однако оно будет не полностью отделанный символ, для этого вам нужно использовать файл определения и экспортировать его как именованный символ, в противном случае вам нужно использовать GetProcAddress, используя искаженное / украшенное имя символа, которое коротко, когда экспортируется с использованием extern "C".

1 голос
/ 20 июня 2010

Вы делаете это неправильно.Пары __declspec (dllexport) с __declspec (dllimport).

#1: In the DLL, declare the function's prototype with __declspec(dllexport).
#2: In the .exe, declare the function's prototype with __declspec(dllimport).
#3: Compile the .dll. You should also get a .lib file.
#4: Link the .exe with the .lib, and compile.
#5: Success.

Когда вы используете __declspec (dllimport) и __declspec (dllexport), вам никогда не нужно прикасаться к функциям WinAPI для загрузки DLL.dllimport / export делает все это за вас.Кроме того, вам не нужно ничего набирать C.

0 голосов
/ 20 июня 2010

Если DLL собрана как C ++ dll, имена ее функций изменятся. Это зависит от компилятора. Я настоятельно рекомендую сделать это C dll (C интерфейс + C ++ кишки). У меня сейчас нет примера, но вы должны найти что-то в сети.

...