我有一个设备DLL库“Device.DLL”,我想做一个掩码库“Mask.DLL”。我只有设备DLL,而不是.lib。
我的代码:
// Load library
hLibHandle = LoadLibrary(L"Device.dll");
// GetProcAddress for my function
myDeviceFunc = (lpmyDeviceFunc)GetProcAddress(hLibHandle, "myDeviceFuncName");
// Calling function
myDeviceFunc();
这在控制台应用程序中运行良好,但在我的Win32 DLL中没有。当我从Mask.DLL运行MyDeviceFuncMask()时,我得到“应用程序已停止工作”。
MyDeviceFuncMask()只是这样做:
EXPORT_DEFINE int MyDeviceFuncMask() {
// Load library
hLibHandle = LoadLibrary(L"Device.dll");
// GetProcAddress for my function
myDeviceFunc = (lpmyDeviceFunc)GetProcAddress(hLibHandle, "myDeviceFuncName");
// Calling function
int result = myDeviceFunc();
return result;
}
我已经导出了其他函数并且DLL运行良好,例如:
EXPORT_DEFINE int TestFunc() {
return CONST_SUCCESS;
}
答案 0 :(得分:0)
您的LoadLibrary调用很可能失败,但此处没有足够的信息来诊断它。所以这里列出了LoadLibrary失败的原因:
除了彻底失败之外,如果名称与已加载到进程中的另一个DLL冲突,也可能会意外加载错误的DLL。如果您尝试加载foo.dll,但已经在该过程中加载了另一个foo.dll,那么您只需获得已经加载的foo.dll。我相信只有在使用绝对文件路径加载它时,才能加载两个具有相同名称的DLL。
如果最终得到错误DLL的句柄,那么可能会导致后续GetProcAddress失败。您可以在调试器中快速诊断,方法是在LoadLibrary调用上放置一个断点,然后搜索OutputWindow以查看是否已经加载了另一个同名的DLL。 (但是,实际上,你应该检查LoadLibrary和GetProcAddress的返回值。)
我已将此设为社区维基,以便其他人可以添加LoadLibrary失败的原因,并且当他们发布有关LoadLibrary失败的问题时,我们可以在此处引导人们。