gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:46:23 25 4
gpt4 key购买 nike

我有一些代码正在尝试加载 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com