我有一個項目,我從Visual Studio 2003 .NET轉換爲Visual Studio 2010.它不是一個.NET項目;它是Visual C++(非託管)。LoadLibrary失敗; GetLastError沒有幫助
該DLL引入附加的DLL。如果我將一個可執行文件與這個DLL鏈接起來,那麼這個可執行文件會在DLL初始化過程中死掉(我可以告訴,有被調用的靜態對象的構造函數,我可以看到他們的操作。)我從我的路徑中刪除了所有VS 2010創建的DLL,除了其中一個導致錯誤。用VS.NET創建的版本替換那個版本允許程序運行。
由於我沒有收到任何有用的信息,我決定編寫一個測試應用程序,它不直接鏈接到DLL,而是使用LoadLibrary加載庫。這個想法是我可以使用GetLastError()來幫助解決庫問題。不走;我收到一個錯誤代碼-529697949,它根本不是Windows錯誤代碼! (如果我將DLL更改爲VS.NET創建的版本,程序會正確加載DLL。)
我使用Dependency Walker(www.dependencywalker.com)來檢查DLL,它告訴我「至少沒有找到一個延遲加載依賴模塊,「突出顯示IESHIMS.DLL和WER.DLL。我沒有看到該工具的其他錯誤。在VS.NET創建的DLL上運行它顯示了相同的兩個警告,所以我認爲這是一個紅色的鯡魚。
static void showMessage(const wchar_t *wmsg)
{
std::wcout << wmsg << std::endl;
::MessageBox(NULL, wmsg, TEXT("Message"), MB_OK);
}
static void testLoadLibrary(const wchar_t *lib)
{
::SetLastError(0L);
::SetErrorMode(0);
std::wstringstream wss;
wss << "LoadLibrary: " << lib;
showMessage(wss.str().c_str());
HINSTANCE LoadME = ::AfxLoadLibrary(lib);
if (LoadME == NULL) {
DWORD dw = ::GetLastError();
wss << "Failed: Error code " << dw;
showMessage(wss.str().c_str());
ErrorExit(lib, dw);
} else {
wss << "LoadLibrary of " << lib << " succeeded.";
showMessage(wss.str().c_str());
::FreeLibrary(LoadME);
}
}
最後,我跑的Process Monitor(sysinternals.com)來監視測試程序,尋找與包含字符串路徑的所有條目 「DLL」。我在這個列表中沒有看到任何特別的信息 - 不知道爲什麼DLL無法加載。
如果我使用LoadLibraryEx和DONT_RESOLVE_DLL_REFERENCES,庫加載,所以這真的看起來像一個依賴項問題,這就是爲什麼我很驚訝,依賴walker不是特別有用。
我在Windows 2008 R2和Windows 2003上試過這個;同樣的行爲。
有什麼建議嗎?
謝謝你的幫助。它將DLL隔離爲問題,但沒有解釋爲什麼。看起來,從CWinApp派生的類定義可能是culprint;我不確定它爲什麼包含在DLL中,並且從項目中刪除.cpp允許加載庫時沒有錯誤。 – lar3ry 2011-05-31 17:02:57
是基於MFC的項目嗎?是否安裝了相關的MFC dll?你是否混合調試和發佈編譯的東西? – 2011-06-01 03:55:08