![]() |
|
![]() ![]() ![]() |
|
Smarts |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.4.2007 Репутация: нет Всего: 2 |
Есть программа написанная в VS 2005, стоит режим Release, больше никаких настроек не менял.
Используется один .dll файл, который лежит в папке с программой. MFC нет, это простое консольное приложение, все основные функции находятся в dll. На моем компьютере работает исправно, при переносе на другие - возникает такая ошибка: LdrError.gif Не знаю как исправить, у меня все работает нормально, а у других - нет. Посоветуйте, что можно сделать в данном случае? Если нужна какая-нибудь дополнительная информация - могу написать тут. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Дело наверняка, как всегда, в DLL. Кроме MFC, есть еще С Runtime, называется что-то типа msvcXXX.DLL. Вот ее нужно с собою таскать. Или слинковать как статическую. Лучше всего посмотреть с помощью Dependency Viewer, от каких DLL зависит твоя программа.
-------------------- ... |
|||
|
||||
dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
Проблема в том, что любая программа написанная под vs8.0 будет работать только с установленной .Net Framework.
Твой выбор такой 1. Линковать MFC библиотеки статически. ALT P + P=> General=> Use Of MFC: Use MFC in a static library ALT P + P=> C/C++=> Code Generation=> Runtime Library : multi-threaded Ну и ALT P + P=> Linker=> Manifest File=> Generate Manifes=> No 2. По прежнему использовать динамическую линковку тогда тебе нужно Почитай статью Поставить на машину заказчика ту версую .net framework, которая была использована для разработки. Она потянет за собой IE и WindowsInstaller а также необходимые сервис паки. Или руками Я понял плохо но похоже порядок таков Убедиться в генерации манифеста Посмотреть список используемых тобой dll Создать папку(и) C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd, где имя последней папки зависит от версии сервис пака ОС, самой ОС, версии .Net Framework и версий конкретной используемой тобой dll. Скопировать туда все dll. После чего они будут грузиться динамически Т.е все дело в том, что с выходом vs2005 работа с динамическими библиотеками ведется через манифесты (загрузка). Манифест либо шьется в *.exe, либо кладется в папку *.exe как файл *.manifest. Программа написанная на VS2005 динамически не станет грузить dll, если не видит манифеста. Если видит, то грузить будет, но сами dll обязаны распологаться не в папке *.exe, не в папке system или system32 или winnt, а в папке winsxs в соответствующей подпапке. Что делать в случае смены сервис-пака или версии .net я не знаю. Короче, я был бы очень рад если бы мне кто-то объяснил как предполагается все это делать динамически. Это сообщение отредактировал(а) dizzy1984 - 23.4.2007, 09:48 |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
dizzy1984, вовсе не обязательно наличие NET - если, конечно, проект NET не использует.
Smarts писал, что приложение консольное, так что вряд ли там NET. Но проверить, конечно, стоит. И с манифестом ты усложняешь. Без манифеста будут загружаться стандартные библиотеки, не поддерживающие тем. Так что все работать будет, но без современной раскраски. Smarts, проблема поднималась неоднократно, поищи по форуму. -------------------- ... |
|||
|
||||
Smarts |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.4.2007 Репутация: нет Всего: 2 |
dizzy1984, спасибо за развернутый ответ, только первый пункт отпадает, так как там стоит WinXP SP2 и этот файл по умолчанию уже установлен, а вот .Net Framework скорее всего как раз 1.1 (включен в SP2), а обновление не устанавливали. Хотя .Net не использовался, но все равно сегодня обновлю и напишу тут.
Кстати ссылка не открывается, к тому же ведет на localhost :( Earnest, поиском пользовался, но в каждом случае проблема имеет различные причины, обычно все сводилось к установке конфигурации Release и статической линковке библиотек, но сейчас это не помогает... |
|||
|
||||
dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
Earnest, ты сильно ошибаешься. Я полностью уверен в том, что абсолютно любая программа написанная на vs80 с динамической линковкой mfc не станет работать без манифестов на ОС windows xp. Я могу отдать свою правую руку на отсечение что это так.
Earnest, File->New->Project->Win32->Win32 Console Application Ставим галочку напротив MFC. Release. Build. test1 - 0 error(s), 0 warning(s) w32dasm.exe load test1.exe Number of Imported Modules = 3 (decimal) Import Module 001: MFC80U.DLL Import Module 002: MSVCR80.dll Import Module 003: KERNEL32.dll Копирует указанные библиотеки в папку с *.exe файлом. Идем на машину с windows xp. .net не установлена. Запускаем программу Сообщение. Не удается выполнить указанную программу. Здесь дело не в том, что программа использует .net, а в том, что используется новый способ загрузки dll. Я не уверен, но думаю что здесь речь идет не о том манифесте о котором говоришь ты, т.к этот нушен не для тем, а исключительно для контроля версий dll. Smarts, вот ссылка извини за localhost http://www.codeproject.com/cpp/vcredists_x86.asp какой этот? если ты про dll, то варианты все равно могут быть. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
??? dizzy1984, я честно сказать, с VC2005 не проверяла, но ты что же, хочешь сказать, что он не может создать приложение для не XP? Для всяких там 98-2000, которые про манифесты и нетворки слыхом не слыхали? Вот 2003 может, а стало быть 2005 - уже нет? Не такие же в MS придурки... -------------------- ... |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
Насчёт dotnetfx. Его нужно таскать только если юзаем дотнет. Иначе - нафиг не надо.
Второе - манифесты и всё, что с этим связано. Для начала лирическое отступление. В XP появилась такая ерунда как загрузка длл с помощью манифестов. В таблицу импорта кидается обычный импорт из длл-ки, именно он сработает не на XP (точнее до ИксПи). В ресурсы (или в папку с экзешником/длл-кой) кидается манифест, в котором описывается та длл-ка, которая нам нужна. На определённой машине будет загружена нужная длл-ка, берущаяся из %WinDir%\WinSxS\<arch_name>_<lib_name>_<key>. Где ключ берётся из версии либы и сертификата безопкасности производителя (какая там хеш-функция - не знаю). При этом гарантируется, что с одной сторона будет загружена последняя (доступная на компе) версия длл (со всеми хотфиксами), а с другой - бэквард компатибилити будет соблюено. Для этого и критерии в манифестах (+ папочка $WinDir%\WinSxS\Manifests). Библиотека commctl32.dll входит в XP в двух видах: 5-ая версия в system32 и 6-ая в недрах WinSxS. Последнюю соответственно загружаем с помощью манифестов. Отсюда Visual Styles и требуют манифестов. VS 2005 весь рантайм (VC Runtime, VC++ Runtime, ATL, MFC) грузит через манифесты по дефолту. Енто можно отключить в пропертях проекта, если нужно. Если же не отключаем, то: 1. До XP всё работает обычно. 2. Винда >= XP будет грузить эти либы только через манифесты (раз манифест есть). Иначе ни как. Наиболее грамотный способ такскать с собой маленький экзешник VC++ 2005 Redistutable (правильно написал? ![]() ![]() ЗЫ И читайте всякие What's new почаще. А то студию ставим, а посмотреть что й же здесь нового ленимся. ![]() |
|||
|
||||
dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
Во-первых, спасибо, Любитель, за ваш ответ.
Во-вторых, я не нашел. Есть опция linker->manifest file->generate manifest, но ее отключение приводит к изменению текста сообщения об ошибке. Т.е похоже что то, что вы сказали верно за исключением возможности настроить грузить dll-ки не через манифесты. Это приведет к необходимости таскать с собой .net и для не дотнетных приложений. Мне очень интересен этот вопрос потому, что месяцев 8 назад я взялся за написание не дот-нет ных приложений на visual studio 8.0 и несомненно было необходимо обеспечить их работу на windows xp. Я очень удивился когда прекрасно работающие программы для windows 2000 и windows 98 писали что-то типа "данная программа не была запущена, т.к она не корректно настроена" на xp. Наблюдался факт №2 который был несколько парадоксален. Для отладки программ я ставил на клиентскую машину саму vs, после чего программа начинала работать. Из этих 2-х фактов я сделал вывод, что мне помогла .net поставившаяся с студией. После пары дней возмущения и поиска решений без .net я нашел всего 2 внятных ответа. Оба сводились к необходимости статической линковки. Я долго боролся с собой, но таки остался на vs2005,т.к она новее 6-ки. С тех пор все свои программы я линкую статически, дабы они работали везде. Это сообщение отредактировал(а) dizzy1984 - 23.4.2007, 13:25 |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
Не, я верно сказал, только что точно в пропертях надо ставить не могу сказать - студии нет под рукой. Ты что хочешь? Варианты ответа: 1. Такскать инсталятор и нормально развёртывать приложение - юзай MS-шный пакет, ставящий рантайм (могу ссылку дать, если надо). 2. Таскать папочку и с неё сразу запускать - отключи манифест и таскай *.exe + msvcr80.dll + [msvcp80.dll] + [mfc80.dll] ... ([] - опционально). 3. Таскать один экзешник - ставь статическую линковку. Не только MFC, но и рантайма. Последнее, по-моему, в C++ > Code generation. Но может и где-то в ликер-опциях. Я не помню. :( Добавлено через 59 секунд Кстати, есть ещё (насколько я помню) опции Manifest Tool - посмотри, что там запрятано ![]() Добавлено через 4 минуты и 17 секунд
А вот это никогда не будет. Точно. |
|||
|
||||
dizzy1984 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
Я бы хотел использовать динамическую линковку и конечно мне нет дело до манифестов.
Я не проникся идеологией манифестов.
Я проверил этот вариант. Отключение манифеста не приводит к обычному способу загрузки dll. Так и живем, но это неправильно. |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
Разумней всего всё-таки таскать reditutable пакте рантайма. Он ставится корректно на любую винду и всё работает как надо. Статическая линковка - это крайний случай. Отключение манифестов - тоже не желательно. МС так старались, этот пункт (рантайм через манифесты) объявлен как один из рулезов VC++ 2005... ![]() Добавлено через 1 минуту и 22 секунды
Ты как-то не так отключаешь. Сегодня вечером я посмотрю в студии, разберусь. На днях (как доберусь до инета) - расскажу. ОК? |
|||
|
||||
dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
Ты хочешь сказать, что для утилиты которая выполняет подсчет букв в слове (говорю условно чтобы показать простоту утилиты) мне нужно сделать примерно следующее. 1. Скачать и поставить последний сервис пак windows. 2. Поставить Windows Installer 2.0. 3. Поставить Windows Internet Explorer 6.0 4. Поставить Windows Installer 3.0. 5. Поставить VcRedist_x86.exe Наслаждаться выводом 15-ти строк на экране консоли. Я думаю это не тот случай, когда лучше использовать манифесты
OK ![]() Это сообщение отредактировал(а) dizzy1984 - 23.4.2007, 13:41 |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
Этот - да, абсолютно верно. Я писал все три варианта выше, выбор зависит от масштабности проекта (ну и от личных вкусов). В данном случае я бы вообще линковал статически, но это уже "на вкуси цвет", т. е. мелочи и не подлежит обсуждению. ЗЫ А с манифестами разберусь - сейчас просто студии под рукой нет. |
|||
|
||||
Niko_ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 24.4.2007 Репутация: нет Всего: нет |
Все тот же наболевший вопрос, откомпилил прогу на своей машине все работает, приношу заказчику вот такая ошибка, подскажите как побороть
Присоединённый файл ( Кол-во скачиваний: 22 ) ![]() |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |