Проблемы с развертыванием XP из-за msvcr90.dll попытки загрузить FlsAlloc

StackOverflow https://stackoverflow.com/questions/2443057

Вопрос

У меня есть сборка приложения с 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, что на некоторое время смутило меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top