Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > VS2005 трабл с manifest’ом


Автор: DigitSphinx 8.5.2007, 07:31
При запуске программы выводится сообщение с ошибкой can’t find *.dll надо удалять папку Debug или найти файлы *.manifest и удалить затем откомпилировать проект заново.
как избавится от этой ошибки раз и на всегда ?, какие свойства проекта надо поменять ?

Автор: _hunter 8.5.2007, 10:38
ты бы код ошибки без вольного перевода привел... так же неплохо бы чуть больше написать о способе/месте запуска...

Автор: DigitSphinx 8.5.2007, 14:02
Exe’шник создается нормально , без ошибок !
Но при попытке запуска винда выдает ошибку что типа MFC*.dll не найден ,
Эта ошибка вылезает редко но сильно бесит потому что надо лезть в папку и удалять *.manifest файлы  , на VS2003 такого нет !, только на VS2005.
да и еще почему если поменять с Multi-Byte на Unicode то файл манифеста не подключается и интерфейс из-за этого становится не красивым  smile 

Автор: _hunter 8.5.2007, 14:22
Цитата(DigitSphinx @  8.5.2007,  14:02 Найти цитируемый пост)
 выдает ошибку что типа MFC*.dll не найден ,

а теперь еще раз попробуй пирвести полный код ошибки без вольного толкования...

Автор: Rapalex 8.5.2007, 17:37
Цитата(DigitSphinx @  8.5.2007,  14:02 Найти цитируемый пост)
если поменять с Multi-Byte на Unicode то файл манифеста не подключается и интерфейс из-за этого становится не красивым

Вообщето наоборот, а причина в:
Код

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

Автор: DigitSphinx 8.5.2007, 22:33
Rapalex 
Тьфу да на оборот !!!

_hunter
редкая ошибка но вам повезло , она вылезла опять ))
Код

Приложению не удалось запустится, поскольку MSVCR80D.dll не был найден. Повторная установка приложения может исправить эту проблему.

я на всякий случай прикрепил .jpg файлик чтобы можно было еще и посмотреть на ошибку ))
а Debug выдает это
Код

Debugger:: An unhandled non-continuable STATUS_DLL_NOT_FOUND exception was thrown during process load
The program '[3920] asdsada.exe: Native' has exited with code -1073741515 (0xc0000135).


Автор: dizzy1984 9.5.2007, 18:31
Это известные грабли, связанные с загрузкой через манифест.
Ну и варианты :
1)Статическая линковка
Цитата

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)Динамическая линковка
Цитата

http://www.microsoft.com/downloads/details.aspx?FamilyID=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&displaylang=en
http://www.microsoft.com/downloads/details.aspx?FamilyID=90548130-4468-4BBC-9673-D6ACABD5D13B&displaylang=en

Автор: _hunter 10.5.2007, 11:34
Цитата(DigitSphinx @  8.5.2007,  22:33 Найти цитируемый пост)
редкая ошибка но вам повезло , она вылезла опять ))

это говорит о том, что путь к MSVCR80D.dll не включен в PATH твоей системы. решение: включить его.
при чем тут манифесты?..

Автор: dizzy1984 10.5.2007, 12:53
Цитата(_hunter @  10.5.2007,34 Найти цитируемый пост)
при чем тут манифесты?..

Думаю, вам стоит почитать http://www.codeproject.com/cpp/vcredists_x86.asp
Если вкраце.
Манифесты содержат информацию для загрузки динамических библиотек (*.dll).
Их смысл - разрешение пробем с версиями dll.
Появились в vs2005.

Сейчас все *.dll находятся в  %WinDir%\WinSxS\<arch_name>_<lib_name>_<key> и следовательно при отсутствии такой папки,
(что может быть на компьютере с неустановленной vs2005 runtime) dll-ка не находится.
Это сообщение и выдается.
Что нужно делать я написал.

Вот еще увидел.
Цитата(DigitSphinx @  8.5.2007,  07:31 Найти цитируемый пост)
надо удалять папку Debug или найти файлы *.manifest 

Файлы *.manifest нужны только для старых приложений, которым необходимо использовать новые библиотеки.
Манифесты логичнее включать в *.exe файл.

Цитата(_hunter @  10.5.2007,  11:34 Найти цитируемый пост)
это говорит о том, что путь к MSVCR80D.dll не включен в PATH твоей системы. решение: включить его.

Функция LoadLibrary ищет динамические библиотеки в следующей последовательности
Цитата

The directory from which the application loaded. 
The current directory. 
The system directory. Use the GetSystemDirectory function to get the path of this directory. 
The Windows directory. Use the GetWindowsDirectory function to get the path of this directory
...
The directories that are listed in the PATH environment variable. 

Маловерояно, что DigitSphinx не догадался положить эту dll-ку в c:\windows или c:\windows\system.
Очевидно - проблема не в этом.

Автор: _hunter 10.5.2007, 13:30
Цитата(dizzy1984 @  10.5.2007,  12:53 Найти цитируемый пост)
Если вкраце.Манифесты содержат информацию для загрузки динамических библиотек (*.dll).Их смысл - разрешение пробем с версиями dll.

верю. но если загрузчик не может найти либу ( а ищет он ее в PATH'aх) то проблема именно в PATH а не в манифестах...

Добавлено через 1 минуту и 48 секунд
Цитата(dizzy1984 @  10.5.2007,  12:53 Найти цитируемый пост)
Маловерояно, что DigitSphinx не догадался положить эту dll-ку в c:\windows или c:\windows\system.Очевидно - проблема не в этом.

судя по тому, что они до сих пор не ответил на вопрос о запуске -- в этом...

Автор: dizzy1984 10.5.2007, 16:02
Тогда может вы объясните почему у меня появляется похожее сообщение, когда я пытаюсь запустить программу с дин. линковкой mfc(vs2005) на чистой windows xp?
Все используемые ей dll я копирую в папку с exe, в папку windows и папку system.

Дело в том что манифест накладывает ограничение на расположение библиотек. Загрузка через манифест не станет грузить dll, которые лежат в месте, отличном от winsxs.

Автор: Rapalex 10.5.2007, 16:30
Цитата(dizzy1984 @  10.5.2007,  16:02 Найти цитируемый пост)
Дело в том что манифест накладывает ограничение на расположение библиотек. Загрузка через манифест не станет грузить dll, которые лежат в месте, отличном от winsxs.

А можно ссылку на источник?

Автор: dizzy1984 11.5.2007, 06:27
http://msdn2.microsoft.com/en-us/library/ms235299(VS.80).aspx
Potential run-time errors
Первая строка

Еще по теме манифестов
http://msdn2.microsoft.com/en-us/library/ms235624(VS.80).aspx
http://msdn2.microsoft.com/en-us/library/aa374224.aspx

Цитата(_hunter @  10.5.2007,  13:30 Найти цитируемый пост)
но если загрузчик не может найти либу ( а ищет он ее в PATH'aх) то проблема именно в PATH а не в манифестах...

Значит теперь у нас новый загрузчик или новый способ взаимодействия с загрузчиком. 

Автор: Любитель 12.5.2007, 00:28
Лоадер экзешников в XP и >, если есть либа в манифесте, он грузит её по технологии манифестов. PATH не при чём. Проверяется:

1. %WinDir%\WinSxS\manifests\<архитектура>_<имя_либы>_<hash-ключ>.manifest. И в той же папочки *.cat файл (сертификат безопасности). Хеш-ключ берётся по данным этого сертификата (конкретный алгоритм не знаю). Если сей манифест находится, то длл-ки берутся из папочки %WinDir%\WinSxS\<имя_манифеста_(см._выше)>

Если там ничего не находится, то далее идут прайват-сборки:

2. <app_dir>\<library_name>.manifest => длл-ки берутся из папки с экзехой. Если и здесь неудача, то:
3. <app_dir>\<library_name>\<library_name>.manifest => из <app_dir>\<library_name>

Вообще сие уже обсуждалось. Например http://forum.vingrad.ru/topic-147631.html.


Насчёт визуальных стилей. Официально commctl32.dll версий 6 (ну и выше - когда будут) анси-версии своих функций не поддерживает. Точнее не обязана поддерживать. Как пишет МС - в текущих виндах commctl32.dll (шестой версии, т. е. та, что в WinSxS, в system32 - 5-ой) анси-версии поддерживает. Но сие гарантировать МС не собирается. То есть любой win-fix, любой апдейт теоретически может заменить вашу commctl32.dll на чисто юникодную версию. Отсюда соответствующие директивы в недрах CRT.

Впрочем это я тоже уже пару раз где-то писал. На вскидку где - не помню smile Искать не охота

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)