Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа запускается только на моем компьютере... На любом другом компьютере - ошибка 
V
    Опции темы
Smarts
Дата 23.4.2007, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: нет
Всего: 2



Есть программа написанная в VS 2005, стоит режим Release, больше никаких настроек не менял.
Используется один .dll файл, который лежит в папке с программой. MFC нет, это простое консольное приложение, все основные функции находятся в dll.
На моем компьютере работает исправно, при переносе на другие - возникает такая ошибка: LdrError.gif
Не знаю как исправить, у меня все работает нормально, а у других - нет. Посоветуйте, что можно сделать в данном случае? Если нужна какая-нибудь дополнительная информация - могу написать тут.
PM MAIL   Вверх
Earnest
Дата 23.4.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Дело наверняка, как всегда, в DLL. Кроме MFC, есть еще С Runtime, называется что-то типа msvcXXX.DLL. Вот ее нужно с собою таскать. Или слинковать как статическую. Лучше всего посмотреть с помощью Dependency Viewer, от каких DLL зависит твоя программа.


--------------------
...
PM   Вверх
dizzy1984
Дата 23.4.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Earnest
Дата 23.4.2007, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



dizzy1984, вовсе не обязательно наличие NET - если, конечно, проект NET не использует.
Smarts писал, что приложение консольное, так что вряд ли там NET. Но проверить, конечно, стоит. 
И с манифестом ты усложняешь. Без манифеста будут загружаться стандартные библиотеки, не поддерживающие тем. Так что все работать будет, но без современной раскраски.
Smarts, проблема поднималась неоднократно, поищи по форуму.


--------------------
...
PM   Вверх
Smarts
Дата 23.4.2007, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.4.2007

Репутация: нет
Всего: 2



dizzy1984, спасибо за развернутый ответ, только первый пункт отпадает, так как там стоит WinXP SP2 и этот файл по умолчанию уже установлен, а вот .Net Framework скорее всего как раз 1.1 (включен в SP2), а обновление не устанавливали. Хотя .Net не использовался, но все равно сегодня обновлю и напишу тут.
Кстати ссылка не открывается, к тому же ведет на localhost :(

Earnest, поиском пользовался, но в каждом случае проблема имеет различные причины, обычно все сводилось к установке конфигурации Release и статической линковке библиотек, но сейчас это не помогает...
PM MAIL   Вверх
dizzy1984
Дата 23.4.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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

Цитата(Smarts @  23.4.2007,  10:52 Найти цитируемый пост)
 этот файл по умолчанию уже установлен

какой этот? если ты про dll, то варианты все равно могут быть.
PM MAIL   Вверх
Earnest
Дата 23.4.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(dizzy1984 @  23.4.2007,  12:37 Найти цитируемый пост)
а в том, что используется новый способ загрузки dll

???

dizzy1984, я честно сказать, с VC2005 не проверяла, но ты что же, хочешь сказать, что он не может создать приложение для не XP? Для всяких там 98-2000, которые про манифесты и нетворки слыхом не слыхали?
Вот 2003 может, а стало быть 2005 - уже нет? Не такие же в MS придурки...


--------------------
...
PM   Вверх
Любитель
Дата 23.4.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 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 (правильно написал? smile ). Если нужно же "принёс - и работай", то отключайте манифесты (точнее юзанье рантайма через манифесты, тот же coomct32.dll 6.0 - пожалуйста, грузим через манифесты). Скорее всего в свойствах линкера. На память не скажу, но думаю, разберётесь. smile

ЗЫ И читайте всякие What's new почаще. А то студию ставим, а посмотреть что й же здесь нового ленимся.  smile Вся речь про рантайм через манифесты была одним из первых пунктов в МСДН по "Что нового в VC++ 2005".


--------------------
PM MAIL ICQ Skype   Вверх
dizzy1984
Дата 23.4.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Во-первых, спасибо, Любитель, за ваш ответ.
Цитата(Любитель @  23.4.2007,  12:16 Найти цитируемый пост)
 Если нужно же "принёс - и работай", то отключайте манифесты (точнее юзанье рантайма через манифесты, тот же coomct32.dll 6.0 - пожалуйста, грузим через манифесты). Скорее всего в свойствах линкера. На память не скажу, но думаю, разберётесь

Во-вторых, я не нашел. Есть опция 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
PM MAIL   Вверх
Любитель
Дата 23.4.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



Цитата(dizzy1984 @  23.4.2007,  12:59 Найти цитируемый пост)
Т.е похоже что то, что вы сказали верно за исключением возможности настроить грузить dll-ки не через манифесты. Это приведет к необходимости таскать с собой .net и для не дотнетных приложений.

Не, я верно сказал, только что точно в пропертях надо ставить не могу сказать - студии нет под рукой. Ты что хочешь? Варианты ответа:

1. Такскать инсталятор и нормально развёртывать приложение - юзай MS-шный пакет, ставящий рантайм (могу ссылку дать, если надо).
2. Таскать папочку и с неё сразу запускать - отключи манифест и таскай *.exe + msvcr80.dll + [msvcp80.dll] + [mfc80.dll] ... ([] - опционально).
3. Таскать один экзешник - ставь статическую линковку. Не только MFC, но и рантайма. Последнее, по-моему, в C++ > Code generation. Но может и где-то в ликер-опциях. Я не помню. :(

Добавлено через 59 секунд
Кстати, есть ещё (насколько я помню) опции Manifest Tool - посмотри, что там запрятано smile

Добавлено через 4 минуты и 17 секунд
Цитата(dizzy1984 @  23.4.2007,  12:59 Найти цитируемый пост)
Это приведет к необходимости таскать с собой .net и для не дотнетных приложений

А вот это никогда не будет. Точно.


--------------------
PM MAIL ICQ Skype   Вверх
dizzy1984
Дата 23.4.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Цитата(Любитель @  23.4.2007,  13:11 Найти цитируемый пост)
 Ты что хочешь?

Я бы хотел использовать динамическую линковку и конечно мне нет дело до манифестов.

Цитата(Любитель @  23.4.2007,  13:11 Найти цитируемый пост)
1. Такскать инсталятор и нормально развёртывать приложение - юзай MS-шный пакет, ставящий рантайм (могу ссылку дать, если надо).

Я не проникся идеологией манифестов.

Цитата(Любитель @  23.4.2007,  13:11 Найти цитируемый пост)
2. Таскать папочку и с неё сразу запускать - отключи манифест и таскай *.exe + msvcr80.dll + [msvcp80.dll] + [mfc80.dll] ... ([] - опционально).

Я проверил этот вариант. Отключение манифеста не приводит к обычному способу загрузки dll.

Цитата(Любитель @  23.4.2007,  13:11 Найти цитируемый пост)
3. Таскать один экзешник - ставь статическую линковку.

Так и живем, но это неправильно.

PM MAIL   Вверх
Любитель
Дата 23.4.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



Цитата(dizzy1984 @  23.4.2007,  12:59 Найти цитируемый пост)
Мне очень интересен этот вопрос потому, что месяцев 8 назад я взялся за написание не дот-нет ных приложений на visual studio 8.0 и несомненно было необходимо обеспечить их работу на windows xp. Я очень удивился когда прекрасно работающие программы для windows 2000 и windows 98 писали что-то типа "данная программа не была запущена, т.к она не корректно настроена" на xp. Наблюдался факт №2 который был несколько парадоксален. Для отладки программ я ставил на клиентскую машину саму vs, после чего программа начинала работать. Из этих 2-х фактов я сделал вывод, что мне помогла .net поставившаяся с студией. После пары дней возмущения и поиска решений без .net я нашел всего 2 внятных ответа. Оба сводились к необходимости статической линковки. Я долго боролся с собой, но таки остался на vs2005,т.к она новее 6-ки. С тех пор все свои программы я линкую статически, дабы они работалы везде.

Разумней всего всё-таки таскать reditutable пакте рантайма. Он ставится корректно на любую винду и всё работает как надо. Статическая линковка - это крайний случай. Отключение манифестов - тоже не желательно. МС так старались, этот пункт (рантайм через манифесты) объявлен как один из рулезов VC++ 2005...  smile Да и на самом деле вещь неплохая.
Добавлено через 1 минуту и 22 секунды
Цитата(dizzy1984 @  23.4.2007,  13:23 Найти цитируемый пост)
Я проверил этот вариант. Отключение манифеста не приводит к обычному способу загрузки dll.

Ты как-то не так отключаешь. Сегодня вечером я посмотрю в студии, разберусь. На днях (как доберусь до инета) - расскажу. ОК?


--------------------
PM MAIL ICQ Skype   Вверх
dizzy1984
Дата 23.4.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Цитата(Любитель @  23.4.2007,  13:24 Найти цитируемый пост)
Разумней всего всё-таки таскать reditutable пакте рантайма

Ты хочешь сказать, что для утилиты которая выполняет подсчет букв в слове (говорю условно чтобы показать простоту утилиты) мне нужно сделать примерно следующее.
1. Скачать и поставить последний сервис пак windows.
2. Поставить Windows Installer 2.0.
3. Поставить Windows Internet Explorer 6.0
4. Поставить Windows Installer 3.0.
5. Поставить VcRedist_x86.exe
Наслаждаться выводом 15-ти строк на экране консоли.

Я думаю это не тот случай, когда лучше использовать манифесты

Цитата

 расскажу. ОК?

OK smile 

Это сообщение отредактировал(а) dizzy1984 - 23.4.2007, 13:41
PM MAIL   Вверх
Любитель
Дата 23.4.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 7
Всего: 92



Цитата(dizzy1984 @  23.4.2007,  13:33 Найти цитируемый пост)
Я думаю это не тот случай, когда лучше использовать манифесты

Этот - да, абсолютно верно. Я писал все три варианта выше, выбор зависит от масштабности проекта (ну и от личных вкусов). В данном случае я бы вообще линковал статически, но это уже "на вкуси цвет", т. е. мелочи и не подлежит обсуждению.

ЗЫ А с манифестами разберусь - сейчас просто студии под рукой нет.


--------------------
PM MAIL ICQ Skype   Вверх
Niko_
Дата 24.4.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 24.4.2007

Репутация: нет
Всего: нет



Все тот же наболевший вопрос, откомпилил прогу на своей машине все работает, приношу заказчику вот такая ошибка, подскажите как побороть

Присоединённый файл ( Кол-во скачиваний: 22 )
Присоединённый файл  mfc.jpg 14,73 Kb
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1347 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.