我可以在Win32 DLL中使用LoadLibrary吗?

时间:2018-01-26 23:25:34

标签: c++

我有一个设备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;          
}

1 个答案:

答案 0 :(得分:0)

您的LoadLibrary调用很可能失败,但此处没有足够的信息来诊断它。所以这里列出了LoadLibrary失败的原因:

  • 找不到图书馆。阅读有关命名,搜索顺序等的文档。
  • 该库适用于错误的架构。例如,32位进程无法加载64位DLL。
  • 您正在尝试从DllMain加载库,这将失败,因为加载程序在DllMain期间持有加载程序锁定,以防止DLL在它们依赖的DLL之前加载。
  • DLL的DllMain从DLL_PROCESS_ATTACH回调中返回FALSE。
  • DLL尝试在其DllMain中做一些它不应该做的事情(比如调用LoadLibrary)。
  • 您尝试加载的DLL的传递依赖项无法加载(出于上述任何原因)。例如,如果您尝试加载foo.dll,并且foo.dll与bar.dll链接,则加载程序将首先尝试加载bar.dll,也许这就是失败的原因。<\ n / LI>

除了彻底失败之外,如果名称与已加载到进程中的另一个DLL冲突,也可能会意外加载错误的DLL。如果您尝试加载foo.dll,但已经在该过程中加载了另一个foo.dll,那么您只需获得已经加载的foo.dll。我相信只有在使用绝对文件路径加载它时,才能加载两个具有相同名称的DLL。

如果最终得到错误DLL的句柄,那么可能会导致后续GetProcAddress失败。您可以在调试器中快速诊断,方法是在LoadLibrary调用上放置一个断点,然后搜索OutputWindow以查看是否已经加载了另一个同名的DLL。 (但是,实际上,你应该检查LoadLibrary和GetProcAddress的返回值。)

我已将此设为社区维基,以便其他人可以添加LoadLibrary失败的原因,并且当他们发布有关LoadLibrary失败的问题时,我们可以在此处引导人们。