Почему я не могу получить доступ к своей функции DLL

Я пытаюсь загрузить 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 Console.

4 ответа

Решение

Написать

extern "C" _declspec(dllexport) void MyDllFunc()

Ты делаешь это неправильно. __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 ничего.

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

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

Другие вопросы по тегам