Проблемы с развертыванием XP из-за msvcr90.dll попытки загрузить FlsAlloc
-
19-09-2019 - |
Вопрос
У меня есть сборка приложения с 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 TDLL.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 PCRT4.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 по умолчанию.
Решение 2
Инструмент манифеста действительно глючит, и единственным надежным решением было не встраивать манифест в двоичные файлы, потому что встраивание завершается почти случайным сбоем.Держать манифест снаружи некрасиво, но, по крайней мере, всегда работает.
Другие советы
Я всегда встраиваю манифест в свои библиотеки DLL, и у меня никогда не возникало проблем.Я столкнулся с проблемой только тогда, когда забыл встроить манифест.Затем ему не удается найти MSVCR90.dll в Windows 2008, но он работает в более старых версиях Windows, что на некоторое время смутило меня.