【发布时间】:2012-10-26 16:33:37
【问题描述】:
我有一些代码试图加载一个 Dll。
我遇到了一个奇怪的“错误”。当尝试从绝对路径加载 dll 时,我得到一个 Non-Null HMODULE,它在 GetLastError 调用上没有给出 Windows 错误代码(即 GetLastError 根据msdn 返回“0”或成功)。调用此 dll 中的函数时,我得到不正确的值。
这种行为很特殊,因为如果我使用 SetCurrentDirectory 将当前目录切换为当前 dll 的目录,并使用对 LoadLibrary 的相对路径调用,我会得到正确的值。
这是描述情况的sn-p:
使用绝对路径:
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) .
【问题讨论】:
-
LoadLibraryEx 可能是您最好的选择。
-
更有可能发生其他不明显的事情。 'UseDLL' 是否受目录更改的影响?如果您使用带有硬编码相对路径(但不更改当前目录)的“LoadLibrary”会发生什么?
-
只是稍微相关,但您是否打算在您的 SetCurrentDirectory() 路径调用中包含 DLL 名称?
-
@WhozCraig 这看起来是一个可靠的功能,我会看看它是否有效,但 LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR 标志仅适用于 Windows 7 及更高版本 - 这可能会引入向后兼容性问题。
-
如果是这种情况,依靠 LoadLibrary 的搜索路径将是您唯一的选择,我建议您在下面多次阅读 David 的答案。我讨厌依赖系统搜索路径来搜索除了操作系统库之外的任何东西,只是因为如果利用得当,它可能是一个安全漏洞。听起来您对正在发生的事情有了更好的了解,这很好。
标签: c++ winapi dll absolute-path loadlibrary