У меня есть сборка приложения с VS2008 SP1a (9.0.30729.4148) на Windows 7 x64, которая не хочет запускаться под XP.
Сообщение The application failed to initialize properly (0x80000003). Click on OK to terminate the application.
. Я проверил с depends.exe
и обнаружил, что msvcr90.dll
пытается загрузить FlsAlloc
из KERNEL32.dll - и FlsAlloc доступен только начиная с Vista. Я уверен, что это не используется приложением.
Как решить проблему?
Пакет SxS уже установлен на целевой машине - фактически у меня есть все 3 версии 9.0 SxS (начальный выпуск, sp1 и sp1 + исправление безопасности)
Приложение скомпилировано с _BIND_TO_CURRENT_VCLIBS_VERSION=1
Также я определил правильную целевую версию Windows на stdafx.h
#define WINVER 0x0500
#define _WIN32_WINNT 0x0500
Файл манифеста
<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>
Результат зависит от
Запущено «c: \ program files \ app \ app.EXE» (процесс 0xA0) по адресу 0x00400000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ NTDLL.DLL" по адресу 0x7C900000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ KERNEL32.DLL" по адресу 0x7C800000. Успешно подключен модуль.
Загружен файл "c: \ program files \ app \ MFC90.DLL" по адресу 0x785E0000. Успешно подключен модуль.
Загружен файл "c: \ program files \ app \ MSVCR90.DLL" по адресу 0x78520000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ USER32.DLL" по адресу 0x7E410000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ GDI32.DLL" по адресу 0x77F10000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ SHLWAPI.DLL" по адресу 0x77F60000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ ADVAPI32.DLL" по адресу 0x77DD0000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ RPCRT4.DLL" по адресу 0x77E70000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ SECUR32.DLL" по адресу 0x77FE0000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ MSVCRT.DLL" по адресу 0x77C10000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ COMCTL32.DLL" по адресу 0x5D090000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ MSIMG32.DLL" по адресу 0x76380000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ SHELL32.DLL" по адресу 0x7C9C0000. Успешно подключен модуль.
Загружен файл "c: \ windows \ system32 \ OLEAUT32.DLL" по адресу 0x77120000. Успешно подключен модуль.
Загружен «c: \ windows \ system32 \ OLE32.DLL» по адресу 0x774E0000. Успешно подключен модуль.
Точка входа достигнута. Все неявные модули были загружены.
DllMain (0x78520000, DLL_PROCESS_ATTACH, 0x0012FD30) в "c: \ program files \ app \ MSVCR90.DLL" вызван.
GetProcAddress (0x7C800000 [c: \ windows \ system32 \ KERNEL32.DLL], "FlsAlloc") вызывается из "c: \ program files \ app \ MSVCR90.DLL" по адресу 0x78543ACC и возвращает NULL. Ошибка: указанная процедура не найдена (127).
GetProcAddress (0x7C800000 [c: \ windows \ system32 \ KERNEL32.DLL], "FlsGetValue") вызывается из "c: \ program files \ app \ MSVCR90.DLL" по адресу 0x78543AD9 и возвращает NULL. Ошибка: указанная процедура не найдена (127).
GetProcAddress (0x7C800000 [c: \ windows \ system32 \ KERNEL32.DLL], "FlsSetValue") вызывается из "c: \ program files \ app \ MSVCR90.DLL" по адресу 0x78543AE6 и возвращает NULL. Ошибка: указанная процедура не найдена (127).
GetProcAddress (0x7C800000 [c: \ windows \ system32 \ KERNEL32.DLL], "FlsFree") вызывается из "c: \ program files \ app \ MSVCR90.DLL" по адресу 0x78543AF3 и возвращает NULL. Ошибка: указанная процедура не найдена (127).
Следует отметить, что у меня установлен Windows SDK 7 и настроен как SDK по умолчанию.