![]() |
|
![]() ![]() ![]() |
|
jonie |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
Итак, имеем следующую известную проблему: проблему версий CRT Runtime (рассматриваем vs2008) *
*) для тех кто незнает что это такое: версий баблиотек msvcr90.dll не одна и не две, они лежат в windows\WinSxS папке, и винда грузит нужную версию на основании манифеста, указанного в длл-ке либо в app.exe.config файле Пути ее решения следующие: 1) Поправить в app.exe.config файле, указав конкретный редирект. Например так:
2) найти нужный KB с нужными версиями (вопрос: где взять список того что скачать для конкретной версии CRT?) - поверьте это не такая и простая задача 3) деплоить приложение методом x-copy, беря длл-ки из вашей системы конкретных версий 4) установить
5) метод "прилинковать статически к CRT" не рассматриваем, ибо мы не любим простые решения, да и есть с ним большие проблемы... Вопрос: какой метод вы предпочитаете? UPD: для версии 9.0.30729.4148 вот ссылка http://www.microsoft.com/downloads/details...f5-770a549fd78c, KB973552 Это сообщение отредактировал(а) jonie - 22.7.2010, 12:47 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||
|
|||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: нет Всего: 10 |
линкуем статически. все довольны.
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 2 Всего: 135 |
Я упаковываю в инсталлятор vcredist_x86.exe и запускаю его из своего инсталлятора
IMHO проще некуда -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
borisbn, прочтите внимательно: версий vcredist не одна и не две. Я вот сегодня буквально попал на интересный баг - у меня было две длл, собранные в двух версиях CRT... передал я значится std::string* .... которую создал в одном CRT, а убил в другом... получил "по ушам" минут через 5 работы программы....
Конечно, следить никто не отменял...но часто собрать одному разработчику всё нереально, а билд конвееры могут быть настроены черти-как ..... Abyx, попробуйте сделать с 50 DLL и попередавать std-шные объекты и указатели на них между DLL - будет весело (а еще поиграйтесь в нескольких проектах настройками компилятора и линковщика)..... в общем это не спасение, более того, например отладка утечек памяти в подобных длл весьма и весьма нетривиальна (переопределите new и delete для отладки например)..... -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 2 Всего: 135 |
так этого вообще нельзя делать. Ведь понятно же, что объект stl, созданный в одном CRT нельзя даже использовать, а не только удалять, в другом CRT, т.к. stl оговаривает только интерфейс своих объектов, а никак не реализацию ( даже последовательность объявления методов не оговорена, а тем более последовательность и количество членов класса ). Для этого существуют простые типы char * вместо std::string, int * + size_t вместо std::vector. В данном случае даже установка и настройка всех CRT, использовавшихся при сборке exe и dll не спасёт. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
borisbn, ок. Давайте посмотрим на реализацию log4cxx от апача.. да примером может быть много. Передавать можно, вполне себе, если настройки компиляции и CRT одна и таже. Конкретно в моем случае CRT была тожа одна (9-ая), но разных версий.
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 1 Всего: 110 |
"CRT одна и та же" не то же самое, что одной и той же версии
сам экземпляр должен быть один если приложение состоит из нескольких модулей, и память, выделенная в одном модуле, освобождается в другом, нужно использовать CRT в виде DLL ну и, естественно, таскать его с собой в инсталляторе -------------------- qqq |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
кстати, кому интересно, стоит почитать про winSxS папку тут http://msdn.microsoft.com/en-us/library/aa...28VS.85%29.aspx (раздел "Side-by-side Assemblies" и далее)....
maxim1000 ну да, я немного не так сказал - у меня получилось загрузить два инстанса crt9 и произошел сбой. Это сообщение отредактировал(а) jonie - 23.7.2010, 09:18 -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 2 Всего: 135 |
jonie, у нас несколько довольно крупных проектов. Так уж получилось, что одни части сделаны на Builder'е 5.0, другие - на MSVC 2005, другие - на MSVC 2008.
У нас принято жёсткие правила: 1. Передавать из exe в dll и обратно только простые типы. Никаких stl, vcl, qt-объектов. 2. Всегда явно в коде указывать выравнивание ( #pragma pack( push, 4 ) ) и calling conventions функций ( __stdcall или __cdecl ) 3. Удаляет память ( объекты ) тот, кто создал И проблем с CRT никаких не было. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 1 Всего: 39 |
borisbn правильный подход
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: нет Всего: 10 |
а еще можно бросить этот ####й C++ и писать на C#
|
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 1 Всего: 39 |
ага и в дистрибутив включать .NET Framework
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
borisbn, в указанных тобой случаях это да, необходимо. Но зачастую есть исключения - это не хорошо и не плохо - это нормально.
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
VSB |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 23.8.2007 Репутация: нет Всего: 2 |
Dem_max,
2010 год уже к концу идет, пора бросить XP а в висте и 7 уже есть .NET из коробки (правда в 7 только до 3,5 версии). |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 1 Всего: 39 |
Это не правильный подход. Eсли что напомню, на сей момент до сих пор работают программы под MS-DOS, собственно говоря WinXP еще долго будет на плаву. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |