我可以在 Win32 DLL 中使用 LoadLibrary 吗?
Can I use LoadLibrary inside my Win32 DLL?
我有一个设备 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失败的问题时,我们可以将他们引导到这里。
相关文章:
- Win32编译器选项和内存分配
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- C++win32 API创建多个类似视口的窗口
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- 检测win32服务创建和删除的最佳方法
- WIN32:C++,为什么在WM_CLOSE上调用Messagebox函数程序正在冻结
- 将 win32 hbitmap 转换为 winrt softwarebitmap
- 使用 WIN32 API (C/C++) 对特定树视图项进行着色
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- VSCode C++ 编译的exe感染了Win32:TrojanX-gen[Trj]
- 从预处理器获取 Windows 版本(C++ Win32)
- Issues with Win32 ReadProcessMemory API
- Win32 发送输入鼠标移动滞后并冻结
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 将 Win32/WinAPI 应用程序移植到 wxWidgets
- Win32 API 控制台光标在 WriteConsole 后不移动
- C++ Win32 Threads
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 我可以在 Win32 DLL 中使用 LoadLibrary 吗?