Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2019, 21:51   #1
pucher
Пользователь
 
Регистрация: 06.01.2019
Сообщений: 13
По умолчанию Поясните фрагмент кода #pragma comment

в VS2008 создал из шаблона MFC проект. Все работает. Далее подключаю стороннюю dll. Компиляция проходит успешно. Однако, при запуске приложения ругается на отсутствие MSVCP90.dll. Поиск показал, что такие файлы находятся в подпапках каталога C:\Windows\winsxs. Аналогично и в C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist. Методом "научного тыка" из примера (вроде как был создан в VS2008), поставляемого с подключаемой dll, скопировал в проект кусок кода:

Код:
#ifdef _DEBUG

#ifdef _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' "            
    "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' "              
    "version='" _CRT_ASSEMBLY_VERSION "' "                          
    "processorArchitecture='x86' "                                  
    "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")

#pragma comment(linker,"/manifestdependency:\"type='win32' "        
    "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' "              
    "version='" _MFC_ASSEMBLY_VERSION "' "                          
    "processorArchitecture='x86' "                                  
    "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")

#else
#pragma comment(linker,"/manifestdependency:\"type='win32' "            
    "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' "              
    "version='" _CRT_ASSEMBLY_VERSION "' "                          
    "processorArchitecture='amd64' "                                
    "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")

#pragma comment(linker,"/manifestdependency:\"type='win32' "        
    "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' "              
    "version='" _MFC_ASSEMBLY_VERSION "' "                          
    "processorArchitecture='amd64' "                                
    "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#endif

#endif
и все заработало.

1. Почему без этого кода exe-шник не может найти нужные dll?
2. Где в проекте определяются директивы #ifdef _DEBUG и #ifdef _M_IX86, что условие становится истинным? Где-то в свойствах проекта?
3. Поясните суть этого кода. И как оно влияет на поиск нужной dll. В книге не помню, что бы такое писали. Или дайте ссылку, где хорошо об этом написано.
4. Если создавать аналогичный MFC проект в VS2010, что с данным куском кода, что без, ругается на отсутствие MSVCP90.dll. Заметил, если создать проект в VS2008 c данным куском кода. Затем открыть его в VS2010 и в настройках поставить Platform toolset v90, то работает. Как, изначально создавая проект в VS2010, указать на эту dll?
Спасибо.
pucher вне форума Ответить с цитированием
Старый 11.02.2019, 23:02   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от pucher Посмотреть сообщение
1. Почему без этого кода exe-шник не может найти нужные dll?
Потому что mfc либы не регистрировались глобально, а помещались в winsxs кеш и "загружались" если были прописаны в зависимостях.

Цитата:
Сообщение от pucher Посмотреть сообщение
2. Где в проекте определяются директивы #ifdef _DEBUG и #ifdef _M_IX86, что условие становится истинным? Где-то в свойствах проекта?
Дебаг в настройках проекта, ix86 внутренний

Цитата:
Сообщение от pucher Посмотреть сообщение
3. Поясните суть этого кода. И как оно влияет на поиск нужной dll. В книге не помню, что бы такое писали. Или дайте ссылку, где хорошо об этом написано.
https://en.wikipedia.org/wiki/Side-by-side_assembly
https://docs.microsoft.com/en-us/win...ide-assemblies

Цитата:
Сообщение от pucher Посмотреть сообщение
4. Если создавать аналогичный MFC проект в VS2010, что с данным куском кода, что без, ругается на отсутствие MSVCP90.dll. Заметил, если создать проект в VS2008 c данным куском кода. Затем открыть его в VS2010 и в настройках поставить Platform toolset v90, то работает. Как, изначально создавая проект в VS2010, указать на эту dll?
Распространяйте длл вместе с exe или редистрибом.
p51x на форуме Ответить с цитированием
Старый 12.02.2019, 15:42   #3
pucher
Пользователь
 
Регистрация: 06.01.2019
Сообщений: 13
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение

Распространяйте длл вместе с exe или редистрибом.
Установка разных версий 2008-го редистриба и копирование dll в папку с exe не помогло :/

Последний раз редактировалось pucher; 12.02.2019 в 15:46.
pucher вне форума Ответить с цитированием
Старый 12.02.2019, 15:54   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Для 2008 надо использовать side-by-side или извращаться.
p51x на форуме Ответить с цитированием
Старый 12.02.2019, 17:28   #5
pucher
Пользователь
 
Регистрация: 06.01.2019
Сообщений: 13
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Для 2008 надо использовать side-by-side или извращаться.
Дело в том, что при создании проекта в VS2008 и использовании указанной директивы всё работает. Я так понимаю, side-by-side это указание использования конкретной версии нужной dll, находящейся в папке winsxs. Как я понял, dll в этой папке не регистрируются в системе, как те, что в system32. А эта директива указывает, что dll нужно искать в той папке, при чем нужной версии.
Вопрос же в том, если проект создать в VS2010 и вставить те директивы, то при компиляции появляется предупреждение
Цитата:
warning C4083: expected ')'; found identifier '__LIBRARIES_ASSEMBLY_NAME_PREFIX'
Тем не менее, компиляция проходит успешно. Однако, при запуске exe ругается на отсутствие нужной dll. Может, для VS2010 неправильно указан данный идентификатор и, соответственно, side-by-side работает некорректно.
Я понимаю, можно создать проект в VS2008, открыть его в VS2010, установить platform tools v90 и работать. Но, это же не дело.
pucher вне форума Ответить с цитированием
Старый 12.02.2019, 17:38   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Я же ссылки давал и уже писал:
для 2008 используйте side-by-side
для 2010 распространяйте длл/редистриб пак, т.к. с 2010 длл версионные
p51x на форуме Ответить с цитированием
Старый 12.02.2019, 17:56   #7
pucher
Пользователь
 
Регистрация: 06.01.2019
Сообщений: 13
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Я же ссылки давал и уже писал:
для 2008 используйте side-by-side
для 2010 распространяйте длл/редистриб пак, т.к. с 2010 длл версионные
C vs2008 я разобрался.
Теперь с vs2010. Не может найти MSVCP90.dll. Этот файл относится к редистрибу 2008. Я написал, установил его разные версии. Не помогло. Скопировал dll в папку с программой, не может найти уже другой файл, тоже *90*.dll. Так три dll скопировал. После чего выскакивает ошибка
Цитата:
c runtime error..
pucher вне форума Ответить с цитированием
Старый 12.02.2019, 18:01   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Значит часть проекта/какая-то либа собрана 2008 студией. Пересоберите все 2010.
p51x на форуме Ответить с цитированием
Старый 12.02.2019, 18:26   #9
pucher
Пользователь
 
Регистрация: 06.01.2019
Сообщений: 13
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Значит часть проекта/какая-то либа собрана 2008 студией. Пересоберите все 2010.
Библиотеку, которую я хочу использовать, не могу пересобрать по причине отсутствия у меня её исходников.
В документации к данной библиотеке написано:
Цитата:
Библиотеки созданы с помощью компилятора Microsoft Visual C++ 2008. Поэтому для работы библиотек на компьютере должен быть Redistributable Package Ms Visual C++ 2008 Service Pack 1 версии 9.0.30729.6161. При разработке приложений с использованием нашего API можно использовать любую среду программирования.
Redistributable 2008 9.0.30729.6161 и пару других версий 2008-го редистриба установлены.
Так вот, изначальный вопрос. Хочу создать приложение exe в vs2010 (или выше), построенное, соответственно, на версии редистриба 2010 (или выше). При этом могу ли я подключить к этому приложению сторонний dll, использующий старые версии библиотек (редистриба 2008, например)? При том что, судя по #pragma comment (из примера проекта, поставляемого с этой библиотекой), она использует принцип side-by-side. А для проекта, созданного в vs2010 такой принцип не используется, судя по вашим словам. В этом и вопрос, как? Спасибо

Последний раз редактировалось pucher; 12.02.2019 в 18:41.
pucher вне форума Ответить с цитированием
Старый 12.02.2019, 19:35   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А ваша либа позволяет статически линковаться?
p51x на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фрагмент кода ciy Общие вопросы Delphi 3 24.04.2017 17:53
Подправить фрагмент кода Программистер Общие вопросы Delphi 0 19.01.2017 19:21
Объясните фрагмент кода ka11n Общие вопросы C/C++ 4 04.09.2014 16:27
Удалить фрагмент из кода DeadWarlock Общие вопросы Delphi 2 03.02.2012 00:26
Фрагмент кода С++ Роман Кор Общие вопросы C/C++ 6 22.02.2009 19:25