Dll をロードしようとしているコードがいくつかあります。
これで奇妙な「エラー」が発生しました。絶対パスから dll をロードしようとすると、GetLastError 呼び出しで Windows エラー コードを返さない Non-Null HMODULE を取得します (つまり、 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
この Dll を使用するアプリケーションはマルチスレッドであり、ディレクトリが同じままである必要があるため、SetCurrentDirectory を使用する必要はありません。
この問題に関する洞察をいただければ幸いです。うまくいけば、これは私の側の小さなバグです。
更新: LOAD_LIBRARY_SEARCH_* フラグが使用できないように見えるため、 LoadLibraryExを使用することは問題外のようです (私は既にKB2533623 更新プログラムをインストールしようとしました)。