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

Can I use LoadLibrary inside my Win32 DLL?

本文关键字:LoadLibrary Win32 DLL 我可以      更新时间:2023-10-16

我有一个设备 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 中没有。当我从我的掩码运行我的 MyDeviceFuncMask() 时.DLL我得到"应用程序已停止工作"。

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;          
}

您的 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,也许这就是失败的原因。

除了彻底失败之外,如果名称与已加载到进程中的另一个 DLL 冲突,还可能意外加载错误的 DLL。 如果您尝试加载 foo.dll,但另一个 foo.dll 已经加载到进程中,您将得到一个已经加载的句柄的新句柄。 我相信只有使用绝对文件路径加载两个同名的 DLL,您才能加载它。

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

我把它变成了一个社区wiki,这样其他人就可以添加LoadLibrary可能失败的原因,当人们发布有关LoadLibrary失败的问题时,我们可以将他们引导到这里。