Lo strumento Microsoft gflags ti dirà sempre esattamente quale tipo di carico non viene caricato e perché.
Corsa gflags -i your_application.exe +sls
. Successivamente eseguire l'applicazione sotto il debugger per acquisire lo loader traces.
gflags fa parte di Debugging Tools - è possibile effettuare il check-in C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
per vedere se ce l'hai già. Puoi aggiungere quella directory al tuo percorso, o semplicemente eseguire gflags da quella directory in cmd.exe.
Ad esempio, dopo aver eseguito gflag, inserire un punto di interruzione nella chiamata ::LoadLibrary(_T("foo"))
e scavalcarlo mentre si cercano errori di caricamento nella finestra di output di Visual Studio, ad es.
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
Questo significa che durante il carico di foo.dll
, la dipendenza bar.dll
è stato importato, e l'importazione bar.dll
fallito.
L'importazione delle dipendenze non è riuscita perché mancava la procedura [email protected][email protected]@[email protected]
- è possibile eseguire demangle in public: void __cdecl vis_DollarMap::SetObject(int,void * __ptr64) __ptr64
.
Probabilmente hai la versione sbagliata di una dipendenza - forse è necessario ricostruire la dipendenza per aggiornarla.
Eseguire gflags -i your_application.exe -sls
in seguito per disabilitare le tracce del caricatore.
Forse non ci sono 'DllMain' nella libreria? Dovrebbe fallire ':: LoadLibrary'? –
Se 'DllMain' imposta'ultimo errore 'come 127 e poi restituisce' FALSE', l'' ultimo errore 'verrà sovrascritto dal sistema prima di tornare da ':: LoadLibrary'? –