problemi di XP Distribuzione a causa di Msvcr90.dll cercando di caricare FlsAlloc
-
19-09-2019 - |
Domanda
Ho un'applicazione costruire con VS2008 SP1a (9.0.30729.4148) su Windows 7 x64 che non vuole iniziare sotto XP.
Il messaggio è The application failed to initialize properly (0x80000003). Click on OK to terminate the application.
. Ho controllato con depends.exe
e ha scoperto che msvcr90.dll
non provare a caricare FlsAlloc
da KERNEL32.dll - e FlsAlloc è disponibile solo a partire con Vista. Sono sicuro che non è utilizzata dall'applicazione.
Come risolvere il problema?
Il pacchetto SxS è già installato sul computer di destinazione - In realtà ho tutte e 3 le versioni di 9.0 SxS (versione iniziale, SP1 e SP1 + patch di sicurezza)
L'applicazione è compilato con _BIND_TO_CURRENT_VCLIBS_VERSION=1
Inoltre ho definito il bersaglio giusto versione di Windows sul stdafx.h
#define WINVER 0x0500
#define _WIN32_WINNT 0x0500
file manifesto
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" />
</dependentAssembly>
</dependency>
</assembly>
Risultato da dipende
Started "c: \ program files \ app \ app.exe" (processo 0xA0) a indirizzo 0x00400000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ NTDLL.DLL" all'indirizzo 0x7C900000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ KERNEL32.DLL" all'indirizzo 0x7C800000. modulo correttamente agganciato. Loaded "c: \ program files \ app \ MFC90.DLL" all'indirizzo 0x785E0000. modulo correttamente agganciato. Loaded "c: \ program files \ app \ Msvcr90.dll" all'indirizzo 0x78520000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ USER32.DLL" all'indirizzo 0x7E410000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ GDI32.DLL" a indirizzo 0x77F10000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ SHLWAPI.DLL" all'indirizzo 0x77F60000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ ADVAPI32.DLL" all'indirizzo 0x77DD0000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ RPCRT4.DLL" all'indirizzo 0x77E70000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ Secur32.dll" all'indirizzo 0x77FE0000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ MSVCRT.DLL" all'indirizzo 0x77C10000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ COMCTL32.DLL" all'indirizzo 0x5D090000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ MSIMG32.DLL" all'indirizzo 0x76380000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ SHELL32.DLL" all'indirizzo 0x7C9C0000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ OLEAUT32.DLL" all'indirizzo 0x77120000. modulo correttamente agganciato. Loaded "c: \ windows \ system32 \ OLE32.DLL" all'indirizzo 0x774E0000. modulo correttamente agganciato. Entrypoint raggiunto. Tutti i moduli impliciti sono stati caricati. DllMain (0x78520000, DLL_PROCESS_ATTACH, 0x0012FD30) in "c: \ program files \ app \ Msvcr90.dll" chiamato. GetProcAddress (0x7C800000 [c: \ windows \ system32 \ KERNEL32.DLL], "FlsAlloc") chiamato da "c: \ programmi \ app \ Msvcr90.dll" all'indirizzo 0x78543ACC e restituito NULL. Errore: La procedura specificata non è stata trovata (127). GetProcAddress (0x7C800000 [c: \ windows \ system32 \ KERNEL32.DLL], "FlsGetValue") chiamato da "c: \ programmi \ app \ Msvcr90.dll" all'indirizzo 0x78543AD9 e restituito NULL. Errore: La procedura specificata non è stata trovata (127). GetProcAddress (0x7C800000 [c: \ windows \ system32 \ KERNEL32.DLL], "FlsSetValue") chiamato da "c: \ programmi \ app \ Msvcr90.dll" all'indirizzo 0x78543AE6 e restituito NULL. Errore: La procedura specificata non è stata trovata (127). GetProcAddress (0x7C800000 [c: \ windows \ system32 \ KERNEL32.DLL], "FlsFree") chiamato da "c: \ programmi \ app \ Msvcr90.dll" all'indirizzo 0x78543AF3 e restituito NULL. Errore:. La procedura specificata non è stata trovata (127)
Devo dire che ho Windows SDK 7 installato e configurato come SDK di default.
Soluzione 2
strumento manifesto è davvero buggy e l'unica soluzione affidabile è stato quello di non incorporare il manifesto nei binari perché l'incorporamento fallisce quasi in modo casuale. Mantenere l'esterno manifesto è brutto, ma almeno funziona sempre.
Altri suggerimenti
Ho sempre incorporare il manifesto nei miei DLL e non ho mai avuto un problema. Mi sono imbattuto in un problema solo quando ho dimenticato di incorporare il manifesto. Poi non riesce a trovare il Msvcr90.dll su Windows 2008, ma funziona su versioni precedenti di Windows, il che mi ha confuso per un po '.