XP Развертывание проблем из-за msvcr90.dll при попытке загрузить FlsAlloc - PullRequest
0 голосов
/ 14 марта 2010

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

Ответы [ 2 ]

0 голосов
/ 15 июня 2011

Я всегда встраиваю манифест в свои библиотеки DLL, и у меня никогда не было проблем. Я столкнулся с проблемой, только когда забыл вставить манифест. Затем он не может найти MSVCR90.dll в Windows 2008, но он работает в старых версиях Windows, что меня некоторое время смущало.

0 голосов
/ 09 августа 2010

Инструмент манифеста действительно глючит, и единственное надежное решение состояло в том, чтобы не вставлять манифест в двоичные файлы, потому что встраивание не удается почти случайно. Хранить манифест снаружи ужасно, но, по крайней мере, всегда работает.

...