Если в компилируемой библиотеке отсутствует текущая среда SMvcr80.dll на С++, есть ли способ определить, какая версия была использована для создания библиотеки или заставить ее запускаться в более поздней версии msvcr80.dll?
Отсутствует msvcr80.dll
Ответ 1
Распространяемый пакет VC80 SP1 CRT устанавливает как RTM, так и версии SP1 версии C в %SystemRoot%\WinSxS
(при условии, что вы используете Windows XP или Vista, Windows 2000 не поддерживает сборочные сборки). Если у вас установлен VC8, распространяемый пакет CRT находится в %ProgramFiles%\Microsoft Visual Studio 8\VC\redist
. Если у вас нет установленного VC8, я думаю, вы можете загрузить распространяемый CRT-пакет с Microsoft.com.
Кроме того, чтобы выяснить, какая версия CRT (например, RTM или SP1) требуется двоичной, которая была построена с помощью VC8 или VC9, вы можете извлечь манифест:
mt.exe -inputresource:mydll.dll;#1 -out:mydll.dll.manifest
Ищите что-то вроде этого:
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">
</assemblyIdentity>
Для моего исполняемого файла требуется CRT версия 9.0.21022.8. Этот номер версии также встроен в имена подкаталогов WinSxS
(к сожалению, он окружен хэшами):
D:>dir c:\windows\WinSxS\*VC90.CRT*
12/14/2007 02:16 AM <DIR> amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b
12/14/2007 02:00 AM <DIR> x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_bcb86ed6ac711f91
Ответ 2
Dependency Walker поможет вам ответить на этот вопрос.
Ответ 3
Если вы создаете и распространяете упомянутую DLL, рассмотрите возможность использования модуля слияния для Visual С++ 8.0 CRT как части вашего установщика.
Я заметил, что есть новый инструмент mt.exe и новый Visual С++ CRT в Windows SDK 6.1. Я использую модуль слияния как необходимое условие в InstallShield 12 с большим успехом.