Почему я не могу получить доступ к своей функции 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 ответа
Ты делаешь это неправильно. __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++ кишки). У меня сейчас нет примера, но вы должны найти что-то в сети.