Microsoft gflags工具将始终准确地告诉您哪些依赖项无法加载以及原因。
运行gflags -i your_application.exe +sls
。之后在调试器下执行应用程序以捕获加载程序跟踪。
gflags 是调试工具的一部分——你可以检查一下C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
你是否已经拥有它。您可以将该目录添加到您的路径中,或者只在 cmd.exe 中从该目录执行 gflags。
例如,在运行 gflags 后,在调用上放置一个断点::LoadLibrary(_T("foo"))
并在 Visual Studio 输出窗口中查找加载程序错误时跳过它,例如
4b00:396c @ 479194074 - LdrpSnapThunk - ERROR: Procedure "?SetObject@vis_DollarMap@@QEAAXHPEAX@Z" 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
导入失败。
依赖项导入失败,因为?SetObject@vis_DollarMap@@QEAAXHPEAX@Z
缺少该过程 - 您可以将其分解为public: void __cdecl vis_DollarMap::SetObject(int,void * __ptr64) __ptr64
.
您可能拥有错误版本的依赖项——也许您需要重建依赖项以使其保持最新。
之后运行gflags -i your_application.exe -sls
以禁用加载程序跟踪。