Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 то файл манифеста не подключается и интерфейс из-за этого становится не красивым ![]() |
Автор: _hunter 8.5.2007, 14:22 |
а теперь еще раз попробуй пирвести полный код ошибки без вольного толкования... |
Автор: DigitSphinx 8.5.2007, 22:33 | ||||
Rapalex Тьфу да на оборот !!! _hunter редкая ошибка но вам повезло , она вылезла опять ))
я на всякий случай прикрепил .jpg файлик чтобы можно было еще и посмотреть на ошибку )) а Debug выдает это
|
Автор: dizzy1984 9.5.2007, 18:31 | ||||
Это известные грабли, связанные с загрузкой через манифест. Ну и варианты : 1)Статическая линковка
2)Динамическая линковка
|
Автор: _hunter 10.5.2007, 11:34 |
это говорит о том, что путь к MSVCR80D.dll не включен в PATH твоей системы. решение: включить его. при чем тут манифесты?.. |
Автор: dizzy1984 10.5.2007, 12:53 | ||||
Думаю, вам стоит почитать http://www.codeproject.com/cpp/vcredists_x86.asp Если вкраце. Манифесты содержат информацию для загрузки динамических библиотек (*.dll). Их смысл - разрешение пробем с версиями dll. Появились в vs2005. Сейчас все *.dll находятся в %WinDir%\WinSxS\<arch_name>_<lib_name>_<key> и следовательно при отсутствии такой папки, (что может быть на компьютере с неустановленной vs2005 runtime) dll-ка не находится. Это сообщение и выдается. Что нужно делать я написал. Вот еще увидел. Файлы *.manifest нужны только для старых приложений, которым необходимо использовать новые библиотеки. Манифесты логичнее включать в *.exe файл.
Функция LoadLibrary ищет динамические библиотеки в следующей последовательности
Маловерояно, что DigitSphinx не догадался положить эту dll-ку в c:\windows или c:\windows\system. Очевидно - проблема не в этом. |
Автор: _hunter 10.5.2007, 13:30 | ||||
верю. но если загрузчик не может найти либу ( а ищет он ее в PATH'aх) то проблема именно в PATH а не в манифестах... Добавлено через 1 минуту и 48 секунд
судя по тому, что они до сих пор не ответил на вопрос о запуске -- в этом... |
Автор: dizzy1984 10.5.2007, 16:02 |
Тогда может вы объясните почему у меня появляется похожее сообщение, когда я пытаюсь запустить программу с дин. линковкой mfc(vs2005) на чистой windows xp? Все используемые ей dll я копирую в папку с exe, в папку windows и папку system. Дело в том что манифест накладывает ограничение на расположение библиотек. Загрузка через манифест не станет грузить dll, которые лежат в месте, отличном от winsxs. |
Автор: Rapalex 10.5.2007, 16:30 | ||
А можно ссылку на источник? |
Автор: 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
Значит теперь у нас новый загрузчик или новый способ взаимодействия с загрузчиком. |
Автор: Любитель 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. Впрочем это я тоже уже пару раз где-то писал. На вскидку где - не помню ![]() |