2011-05-27 59 views
0

我有一個項目,我從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上試過這個;同樣的行爲。

有什麼建議嗎?

回答

2

有一個操作系統工具來幫助診斷這樣的問題。下載SDK或DDK並使用gflags.exe爲該過程設置「顯示加載程序捕捉」(+ sls)。這應該揭示爲什麼DLL加載失敗。

加載程序捕捉輸出將出現在調試程序輸出窗口中。

Martyn

+0

謝謝你的幫助。它將DLL隔離爲問題,但沒有解釋爲什麼。看起來,從CWinApp派生的類定義可能是culprint;我不確定它爲什麼包含在DLL中,並且從項目中刪除.cpp允許加載庫時沒有錯誤。 – lar3ry 2011-05-31 17:02:57

+0

是基於MFC的項目嗎?是否安裝了相關的MFC dll?你是否混合調試和發佈編譯的東西? – 2011-06-01 03:55:08

相關問題