我有一些试图加载 Dll 的代码。
我遇到了一个奇怪的“错误”。当尝试从绝对路径加载 dll 时,我得到一个 Non-Null HMODULE,它在 GetLastError 调用中没有给出 Windows 错误代码(即 GetLastError 根据msdn返回 '0' 或成功)。调用此 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 更新)。