Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программное обеспечение Windows (http://forum.oszone.net/forumdisplay.php?f=7)
-   -   Вопрос об установке программы - C++2012 (http://forum.oszone.net/showthread.php?t=276935)

doc11111 02-02-2014 14:43 2301182

Вопрос об установке программы - C++2012
 
Здравствуйте, подскажите пожалуйста, существует четыре версии программы 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 2301217

Цитата:

Цитата doc11111
если я установлю самую новую версию - 11.0.61030.0, а для работы игры, например, потребуется более ранняя версия - 11.0.51106.1, то игра заработает или нет, »

Нет, не заработает. Каждая игра требует определенной версии библиотеки С++.
Цитата:

Цитата doc11111
т.е. самая новая версия включает в себя и все более старые версии или нужно устанавливать каждую версию программы C++2012? »

Нет, не включает. Все версии С++ устанавливаются side by side(SxS)(совместно друг с другом).

Petya V4sechkin 02-02-2014 18:17 2301335

Цитата:

Цитата doc11111
если я установлю самую новую версию - 11.0.61030.0, а для работы игры, например, потребуется более ранняя версия - 11.0.51106.1, то игра заработает

Заработает.

Цитата:

Цитата Demetriadis
Все версии С++ устанавливаются 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.

Цитата:

Цитата Demetriadis
Нет, не включает

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

Demetriadis 02-02-2014 19:03 2301384

Цитата:

Цитата doc11111
если я установлю самую новую версию - 11.0.61030.0, а для работы игры, например, потребуется более ранняя версия - 11.0.51106.1, то игра заработает или нет, »

А вы проверьте и напишите здесь о результатах. Мое мнение, что нет.
Цитата:

Цитата Petya V4sechkin
Заработает. »

Заработает, если установлены некоторые обновления (по моему наз. MFC), которые не затрагивают версии нужных игре библиотек.
Цитата:

Цитата Petya V4sechkin
По моим наблюдениям, 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 2301400

Цитата:

Цитата Demetriadis
играм это не мешает требовать установки распространяемых компонентов определенной версии

Простой пример: предположим, у нас установлен 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 2302998

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

Petya V4sechkin 05-02-2014 11:41 2303067

Цитата:

Цитата Demetriadis
Исполняемый файл (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\msvcp80.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\msvcr80.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 2303325

Цитата:

Цитата Petya V4sechkin
начит, по-вашему программа запускаться не будет? »

Пример неудачный, в этой утилите есть все необходимые компоненты для запуска и она установит все необходимые файлы автоматически.
Цитата:

Цитата Petya V4sechkin
операционная система вместо старой сборки 8.0.50608.0 загрузит последнюю 8.0.50727.6910. »

Возможно и сработает, но сомнительно.
Цитата:

Цитата Petya V4sechkin
Возможно, поэтому 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 2303351

Цитата:

Цитата Demetriadis
Почему игры требуют установки именно конкретных версий С++, даже когда установлена более новая? »

Пример.

Petya V4sechkin 05-02-2014 18:09 2303388

Цитата:

Цитата Demetriadis
Пример неудачный, в этой утилите есть все необходимые компоненты для запуска и она установит все необходимые файлы автоматически

Цитата:

Цитата Petya V4sechkin
Версия VC 2005 8.0.50608.0 не установлена в системе

Цитата:

Цитата Demetriadis
Возможно и сработает, но сомнительно

Цитата:

Цитата Petya V4sechkin
вот события из Process Monitor

Цитата:

Цитата Demetriadis
Что интересно загрузка происходит из папки WinSxS, а не System32

Разумеется, ведь 3DMark 2006 использует VC 2005.
Цитата:

Цитата Petya V4sechkin
в VC 2010 и более новых отказалась от Side-by-side

Цитата:

Цитата Demetriadis
Если манифесты могут перенаправлять разные версии, почему производители добавляют устаревшие версии распр. компонентов С++(2005-2008)?

Цитата:

Цитата Petya V4sechkin
Конечно, 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 2303449

Цитата:

Цитата Petya V4sechkin
Другими словами, если приложение скомпилировано под VC 2005, должен быть VC 2005. Оно не будет использовать VC 2008, 2012 и т. д.
Не понимаете? :) »

Сколько пользовался разными приложениями и играми, так и не понял почему нужна версия С++ к примеру 8.0.50608.0 для запуска приложения(игры), если у меня установлена 8.0.50727.6195.
Вопрос был именно в этом, а не в годах выпуска. С годом выпуска все понятно.
Цитата:

Цитата Iska
Пример. »

скачайте игру с торрента (подробнее в теме с ошибкой 0x7b), удалите папку Redist или Доп.ПО, установите ее и попробуйте запустить в Win XP.

Petya V4sechkin 05-02-2014 19:52 2303480

Цитата:

Цитата Demetriadis
почему нужна версия С++ к примеру 8.0.50608.0 для запуска приложения(игры), если у меня установлена 8.0.50727.6195

Ну приведите конкретный пример.
И подкрепите его логом Process Monitor, как это сделал я.

Demetriadis 05-02-2014 20:14 2303492

Petya V4sechkin, Не могу. Не умею пользоваться этой утилитой.
Привел пример из личного опыта.

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

Iska 05-02-2014 20:38 2303504

Цитата:

Цитата Demetriadis
скачайте игру с торрента »

Цитата:

Цитата Petya V4sechkin
конкретный пример. »


Demetriadis 09-02-2014 11:37 2305841

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

Petya V4sechkin 09-02-2014 17:44 2306051

Demetriadis, сделайте лог Process Monitor следующим образом:
  1. запустите Process Monitor;
  2. попытайтесь запустить игру;
  3. сохраните лог: меню File -> Save -> PML-формат;
  4. заархивируйте и выложите на любой файлообменник, например http://rghost.ru


Время: 06:55.

Время: 06:55.
© OSzone.net 2001-