c++ - 具有绝对路径的 LoadLibrary 返回不正确的 HMODULE,没有错误

标签 c++ winapi dll absolute-path loadlibrary

我有一些代码正在尝试加载 Dll。

我遇到了一个奇怪的“错误”。当尝试从绝对路径加载 dll 时,我得到一个 Non-Null HMODULE,它在 GetLastError 调用中没有提供任何窗口错误代码(即 GetLastError 返回 '0' 或根据 msdn 成功)。调用此 dll 中的函数时,我得到了不正确的值。

这种行为很奇怪,因为如果相反,我使用 SetCurrentDirectory 将当前目录切换为当前 dll 的目录,并使用对 LoadLibrary 的相对路径调用,我会得到正确的值。

这是描述情况的片段:

使用绝对路径:

std::string libLoc = get_dll_location(); // Get the directory of this dll
HMODULE myDLL = LoadLibraryA(libLoc.c_str()); // Non-null value
DWORD lastError = GetLastError(); // returns 0

MyObj * value = UseDLL(myDLL); // bad value

使用相对路径:

SetCurrentDirectory("c:\\path\\containing\\dll\\"); // hard coded path to dll's folder
HMODULE myDLL = LoadLibrary("myDll.dll");  // Non-null value
MyObj * value = UseDLL(myDLL);  // Good value

我真的很想避免使用 SetCurrentDirectory,因为使用此 Dll 的应用程序可能是多线程的,并且要求目录保持不变。

如果您对此问题有任何见解,我们将不胜感激。希望这只是我的一个小错误。

更新:使用LoadLibraryEx似乎是不可能的,因为 LOAD_LIBRARY_SEARCH_* 标志对我来说似乎不可用(我已经尝试安装 KB2533623 update )。

最佳答案

问题很可能是 MyDll.dll 依赖于与 MyDll.dll 位于同一文件夹中的其他 DLL。当您的应用程序位于与 MyDll.dll 不同的文件夹中时,这些依赖项将不会从包含 MyDll.dll 的文件夹中解析。相反,它们由系统解析 DLL search order .

您使用 SetCurrentDirectory 会影响系统 DLL 搜索顺序。这意味着 MyDll.dll 的依赖项是从包含 MyDll.dll 的目录中解析的。

例如,您可以在配置文件模式下使用 Dependency Walker 来检验这个假设。这将告诉您 MyDll.dll 的依赖项是如何在运行时解决的。

您不喜欢使用 SetCurrentDirectory 是对的。最好的解决方案是将所有 DLL 放在与应用程序相同的目录中。

当然,另一种可能性是对UseDLL 的调用依赖于工作目录。您可以通过在调用 LoadLibrary 后将工作目录更改回其原始值来排除这种情况。

关于c++ - 具有绝对路径的 LoadLibrary 返回不正确的 HMODULE,没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13255845/

相关文章:

c++ - 编写一个使用语音识别的程序......我应该从哪里开始?

c++ - 从已经关闭的套接字接收数据?

c++ - 在测试中使用 unique_ptr 时出现无效指针错误

c++ - 在exe中添加WAV

c# - 将 native C++ 移植到 .NET

c++ - 寻找有关此 C++ 代码为何在没有引用的情况下无法工作的解释

c++ - 为什么我的 DirectInput8 堆栈会溢出?

c# - 使用 P/Invoked GlobalSize 时堆已损坏

c++ - 如何重构现在驻留在静态库中的全局记录器?

PHP 启动 : unable to initialize module