我正在尝试使用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);
}
func返回NULL!
我做错了什么?
这是一个Win32控制台项目。
答案 0 :(得分:3)
写
extern "C" _declspec(dllexport) void MyDllFunc()
答案 1 :(得分: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。
答案 2 :(得分:1)
使用decorated时,导出的函数名称为__declspec(dllexport),您可以使用extern "C"减少装饰,但是,它不会完全修饰符号,为此您需要执行此操作使用def file并将其导出为命名符号,否则您需要使用已修改/修饰的符号名称GetProcAddress
,该名称在使用extern "C"
导出时很短。
答案 3 :(得分:0)
如果DLL是作为C ++ DLL构建的,那么它的函数名称将会改变。这取决于编译器。我强烈建议将其设为C dll(C接口+ C ++胆量)。我现在没有关于我的例子,但你应该能够在网上找到一些东西。