Войти

Показать полную графическую версию : Вопрос об установке программы - C++2012


doc11111
02-02-2014, 14:43
Здравствуйте, подскажите пожалуйста, существует четыре версии программы C++2012, а именно: 11.0.50727.1; 11.0.51106.1; 11.0.60610.1 и самая новая версия - 11.0.61030.0

Мой вопрос: если я установлю самую новую версию - 11.0.61030.0, а для работы игры, например, потребуется более ранняя версия - 11.0.51106.1, то игра заработает или нет, т.е. самая новая версия включает в себя и все более старые версии или нужно устанавливать каждую версию программы C++2012?

Заранее спасибо за Ваши ответы.

Demetriadis
02-02-2014, 15:47
если я установлю самую новую версию - 11.0.61030.0, а для работы игры, например, потребуется более ранняя версия - 11.0.51106.1, то игра заработает или нет, »
Нет, не заработает. Каждая игра требует определенной версии библиотеки С++.
т.е. самая новая версия включает в себя и все более старые версии или нужно устанавливать каждую версию программы C++2012? »
Нет, не включает. Все версии С++ устанавливаются side by side(SxS)(совместно друг с другом).

Petya V4sechkin
02-02-2014, 18:17
если я установлю самую новую версию - 11.0.61030.0, а для работы игры, например, потребуется более ранняя версия - 11.0.51106.1, то игра заработает
Заработает.

Все версии С++ устанавливаются side by side(SxS)(совместно друг с другом)
По моим наблюдениям, 2005 и 2008 ставились как Side-by-side, а последующие 2010, 2012, 2013 при установке копируются в System32 (и в SysWOW64 в 64-битной системе).

Но даже 2005 и 2008 обычно содержали в манифестах директивы bindingRedirect, например:
<bindingRedirect oldVersion="9.0.20718.0-9.0.21022.8" newVersion="9.0.30729.6161"/>
<bindingRedirect oldVersion="9.0.30201.0-9.0.30729.6161" newVersion="9.0.30729.6161"/>

Это позволяло приложениям, скомпилированным под старый VC 2008, запускаться с полностью обновленным VC 2008 SP1.

Нет, не включает
Вы имеете в виду разные VC: 2005, 2008, 2010, 2012 и т. д.
Но в данной теме речь идет исключительно о VC 2012.

Demetriadis
02-02-2014, 19:03
если я установлю самую новую версию - 11.0.61030.0, а для работы игры, например, потребуется более ранняя версия - 11.0.51106.1, то игра заработает или нет, »
А вы проверьте и напишите здесь о результатах. Мое мнение, что нет.
Заработает. »
Заработает, если установлены некоторые обновления (по моему наз. MFC), которые не затрагивают версии нужных игре библиотек.
По моим наблюдениям, 2005 и 2008 ставились как Side-by-side, а последующие 2010, 2012, 2013 при установке копируются в System32 (и в SysWOW64 в 64-битной системе). »
По своему скромному игровому опыту, при установке каждой отдельной игры ставится определенная версия С++ и делается соотв. запись в списке установленных приложений (апплет Установка/удаление программ в Win XP). Там их сейчас около 30-40 разных версий.
Возможно, это просто записи, a файлы обновляются.
Но даже 2005 и 2008 обычно содержали в манифестах директивы bindingRedirect, например:
Тем не менее, играм это не мешает требовать установки распространяемых компонентов определенной версии.

Но в данной теме речь идет исключительно о VC 2012.
Это да. Относительно Visual C++ 2012 возможно и так, хотя наверняка этого не знаю. Пакет обновлений SP1 является накопительным?

Petya V4sechkin
02-02-2014, 19:31
играм это не мешает требовать установки распространяемых компонентов определенной версии
Простой пример: предположим, у нас установлен VC 2008 версии 9.0.30729.6161 (соответствует SP1 с MFC Security Update). А игра требует 9.0.30729.1 (соответствует SP1 без обновлений). Но поскольку в манифесте bindingRedirect, механизм Side-by-side при загрузке библиотек "подсунет" игре 9.0.30729.6161 в любом случае.

P. S. Конечно, 2008 и 2012 (и остальные) друг с другом никак не связаны и не являются взаимозаменяемыми.

Demetriadis
05-02-2014, 09:52
Petya V4sechkin, Не подсунет. Проверялось на многих игр. Все равно будет требовать установки именно той версии, под которую заточена данная игра.
Исполняемый файл (exe файл, который вдобавок еще и как правило патченный) игры в не обладает такой логикой и не читает манифесты.
Даже в библиотеке Steam (лицензионные игры) в дистрибутив игр добавляется и устанавливается(в тихом режиме) собственная версия библиотек VС++.
Если следовать вашему примеру, тогда вообще не нужно ничего добавлять в дистрибутив, а ограничиться установкой обновлений из Microsoft Update.

Petya V4sechkin
05-02-2014, 11:41
Исполняемый файл (exe файл) игры в общем случае не обладает такой логикой и не читает манифесты
Это логика функций операционной системы.

Возьмем для примера какую-нибудь старую программу, типа 3DMark 2006.
В ее файлах Exporter.dll и SI3.dll есть манифесты с зависимостями:
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
Версия VC 2005 8.0.50608.0 не установлена в системе. Значит, по-вашему программа запускаться не будет?

Но есть VC 2005 8.0.50727.6195 (соответствует SP1 с MFC Security Update). Там в файле x86_policy.8.0.microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6195_none_517205a10f4550e3.manifest директива bindingRedirect:
<bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.6195"/>
<bindingRedirect oldVersion="8.0.50727.42-8.0.50727.6195" newVersion="8.0.50727.6195"/>

Кроме того, в составе Windows 8 есть сборка Microsoft.VC80.CRT 8.0.50727.6910 и в файле x86_policy.8.0.microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6910_none_516a74190f4c088e.manifest директива bindingRedirect:
<bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.6910"/>
<bindingRedirect oldVersion="8.0.50727.42-8.0.50727.6910" newVersion="8.0.50727.6910"/>

Так что программа запустится: операционная система вместо старой сборки 8.0.50608.0 загрузит последнюю 8.0.50727.6910.
Если вы по-прежнему мне не верите, вот события из Process Monitor:
3DMark06.exe 4048 Load Image C:\Windows\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6910_none_d089c358442de345\msvcp 80.dll SUCCESS Image Base: 0x6aae0000, Image Size: 0x87000 0.0000000
3DMark06.exe 4048 Load Image C:\Windows\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6910_none_d089c358442de345\msvcr 80.dll SUCCESS Image Base: 0x689e0000, Image Size: 0x9b000 0.0000000


P. S. Возможно, поэтому Microsoft в VC 2010 и более новых отказалась от Side-by-side. Смысла нет, ведь все равно используется последняя сборка.
Игры/приложения, требующие VC 2012, просто грузят нужные им библиотеки из System32 (или SysWOW64 в зависимости от разрядности игры/приложения).

Demetriadis
05-02-2014, 16:23
начит, по-вашему программа запускаться не будет? »
Пример неудачный, в этой утилите есть все необходимые компоненты для запуска и она установит все необходимые файлы автоматически.
операционная система вместо старой сборки 8.0.50608.0 загрузит последнюю 8.0.50727.6910. »
Возможно и сработает, но сомнительно.
Возможно, поэтому Microsoft в VC 2010 и более новых отказалась от Side-by-side. Смысла нет, ведь все равно используется последняя сборка. »
3DMark06.exe 4048 Load Image C:\Windows\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6910_none_d089c358442de345\msvcp 80.dll SUCCESS Image Base: 0x6aae0000, Image Size: 0x87000 0.0000000
Что интересно загрузка происходит из папки WinSxS, а не System32.

Это все очень интересно и занимательно, но пример на утилите 3Dmark, а хотелось проверить на игре.
Остаются вопросы:
Почему игры требуют установки именно конкретных версий С++, даже когда установлена более новая?
Если манифесты могут перенаправлять разные версии, почему производители добавляют устаревшие версии распр. компонентов С++(2005-2008)?
Получается так, что производители игр и др. приложений не знают о манифестах и функциях Windows и пишут код таким образом, чтобы запуск проходил только с определенными версиями С++?

Iska
05-02-2014, 17:17
Почему игры требуют установки именно конкретных версий С++, даже когда установлена более новая? »
Пример.

Petya V4sechkin
05-02-2014, 18:09
Пример неудачный, в этой утилите есть все необходимые компоненты для запуска и она установит все необходимые файлы автоматически
Версия VC 2005 8.0.50608.0 не установлена в системе
Возможно и сработает, но сомнительно
вот события из Process Monitor
Что интересно загрузка происходит из папки WinSxS, а не System32
Разумеется, ведь 3DMark 2006 использует VC 2005.
в VC 2010 и более новых отказалась от Side-by-side
Если манифесты могут перенаправлять разные версии, почему производители добавляют устаревшие версии распр. компонентов С++(2005-2008)?
Конечно, 2008 и 2012 (и остальные) друг с другом никак не связаны и не являются взаимозаменяемыми
Другими словами, если приложение скомпилировано под VC 2005, должен быть VC 2005. Оно не будет использовать VC 2008, 2012 и т. д.
Не понимаете? :)
Ну вот есть VC 2005 8.0.50608.0 и 8.0.50727.6195. Это все VC 2005.
Точно также есть VC 2012 11.0.51106.1 и 11.0.61030.0. Это все VC 2012.
Но VC 2012 не заменяет VC 2005 :)

Demetriadis
05-02-2014, 19:21
Другими словами, если приложение скомпилировано под VC 2005, должен быть VC 2005. Оно не будет использовать VC 2008, 2012 и т. д.
Не понимаете? :) »
Сколько пользовался разными приложениями и играми, так и не понял почему нужна версия С++ к примеру 8.0.50608.0 для запуска приложения(игры), если у меня установлена 8.0.50727.6195.
Вопрос был именно в этом, а не в годах выпуска. С годом выпуска все понятно.
Пример. »
скачайте игру с торрента (подробнее в теме с ошибкой 0x7b), удалите папку Redist или Доп.ПО, установите ее и попробуйте запустить в Win XP.

Petya V4sechkin
05-02-2014, 19:52
почему нужна версия С++ к примеру 8.0.50608.0 для запуска приложения(игры), если у меня установлена 8.0.50727.6195
Ну приведите конкретный пример.
И подкрепите его логом Process Monitor, как это сделал я.

Demetriadis
05-02-2014, 20:14
Petya V4sechkin, Не могу. Не умею пользоваться этой утилитой.
Привел пример из личного опыта.

P.S. Относительно VC++ 2010 и выше согласен. Проверил установкой и запуском нескольких игр (где требуются эти библиотеки). Там действительно изменена установка компонентов.
Тем не менее вопрос с С++ 2005-2008 остается открытым. Проведу эксперименты и посмотрю, как будет запускаться.

Iska
05-02-2014, 20:38
скачайте игру с торрента »
конкретный пример. »

Demetriadis
09-02-2014, 11:37
Reprobates. Next Life
Prince Of Persia Антология
Проверил еще раз. Обе игры не запускаются, если не установлены пререквизиты(естественно речь не о DirectX, Dotnet, OpenAL и пр.), несмотря на наличие обновленной версии VC++ 2005 и 2008.

Petya V4sechkin
09-02-2014, 17:44
Demetriadis, сделайте лог Process Monitor (http://technet.microsoft.com/ru-ru/sysinternals/bb896645) следующим образом:
запустите Process Monitor;
попытайтесь запустить игру;
сохраните лог: меню File -> Save -> PML-формат;
заархивируйте и выложите на любой файлообменник, например http://rghost.ru




© OSzone.net 2001-2012