微軟gflags工具會隨時告訴你到底是什麼依賴性無法加載和原因。
運行gflags -i your_application.exe +sls
。之後,在調試器下執行應用程序以捕獲loader traces。
gflags是Debugging Tools的一部分 - 您可以檢查C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
以查看是否已擁有它。您可以將該目錄添加到您的路徑中,或者僅在cmd.exe中執行該目錄中的gflags。
例如,在運行gflags之後,在::LoadLibrary(_T("foo"))
調用中放置一個斷點並在您的Visual Studio輸出窗口中查找加載器錯誤時跳過它,例如,
4b00:396c @ 479194074 - LdrpSnapThunk - ERROR: Procedure "[email protected][email protected]@[email protected]" could not be located in DLL "bar.dll"
First-chance exception at 0x0000000077307EF8 (ntdll.dll) in your_application.exe: 0xC0000139: Entry Point Not Found.
4b00:396c @ 479194074 - LdrpGenericExceptionFilter - ERROR: Function LdrpSnapIAT raised exception 0xc0000139
Exception record: .exr 0000000000129070
Context record: .cxr 0000000000128B80
4b00:396c @ 479194074 - LdrpHandleOneOldFormatImportDescriptor - ERROR: Snapping the imports from DLL "C:\test\64Debug\foo.DLL" to DLL "C:\test\64Debug\bar.dll" failed with status 0xc0000139
這意味着foo.dll
負載時,依賴bar.dll
是進口,而進口bar.dll
失敗。
的依賴進口失敗,因爲程序[email protected][email protected]@[email protected]
不見了 - 你可以demangle,爲public: void __cdecl vis_DollarMap::SetObject(int,void * __ptr64) __ptr64
。
你可能有依賴的錯版 - 也許你需要重建的依賴得到它最新的。
之後運行gflags -i your_application.exe -sls
禁用加載程序跟蹤。
也許圖書館裏沒有`DllMain`?它應該失敗`:: LoadLibrary`? – 2010-03-17 17:21:19
如果`DllMain`將'最後一個錯誤'設置爲127,然後返回'FALSE`,那麼在':: LoadLibrary`返回之前系統會覆蓋'最後一個錯誤'嗎? – 2010-03-17 17:25:29