2010-06-20 4 views
0

Я пытаюсь загрузить DLL динамически, используя LoadLibrary(), который работает, однако я не могу получить адрес функции в DLL, которую я пытаюсь вызвать.Почему я не могу получить доступ к моей 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); 

} 

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

Что я делаю неправильно?

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

+0

Если вы dll написано на языке C++, вам нужно совместить манекен на языке C++. Просмотрите таблицу экспорта и посмотрите имя функции. Или объявите функцию в dll как extern C, которая удаляет mangeling имени C++. –

ответ

3

Написать

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

в DLL или в вызове кода ?? –

+0

В DLL достаточно. Таким образом, имя будет искажено правильно, и вы сможете получить символ. – Artyom

0

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

1

Вы делаете это неправильно. __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 делает все это для вас. Кроме того, вам ничего не нужно, чтобы extern C ничего.

1

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

+0

Отличная точка зрения, люди склонны забывать, что многие компиляторы C тоже украшают имена. – bk1e