Инструмент Microsoft gflags всегда сообщит вам, какая именно зависимость не загружается и почему.
Выполнить gflags -i your_application.exe +sls
. После этого запустите приложение под отладчиком, чтобы захватить трассировку загрузчика .
gflags является частью Средства отладки - вы можете проверить C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
, чтобы увидеть, есть ли у вас его уже. Вы можете добавить этот каталог в свой путь или просто выполнить gflags из этого каталога в cmd.exe.
Например, после запуска 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
впоследствии, чтобы отключить трассировку загрузчика.