![]() |
|
|
![]()
|
|
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
Суть в следующем.
1. В одном проекте создан класс, отвечающий за отрисовку графика, и диалоговое окно с настройками для этого класса. Проект собран как статическая библиотека. 2. Второй проект (собирается как приложение) - диалог с окошком для графика и др. контролами. Подключена библиотека из первого проекта, график рисуется, но когда я вызываю диалог с настройками графика, ничего не происходит... .DoModal() возвращает -1. Что нужно сделать, чтобы диалог появился? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
А можно узнать, как ты ресурс диалога в статическую библиотеку затолкал?
-------------------- ... |
|||
|
||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
Сначала я создал проект как МФС приложение, потом в настройках поменял тип конфигурации на Static Library (.lib).
Проект, который использует эту библиотеку ругался на неопределенную IDD_GRAPHREALTIME_DIALOG. Так я ее определил в проекте библиотеки с тем же номером, что и в Resource.h
Это неправильно? Или для такой цели нужно использовать динамическую библиотеку как написано в http://forum.vingrad.ru/forum/topic-179955 Это сообщение отредактировал(а) voov - 24.4.2008, 17:40 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Ну, маладэц, слов нет... Ты хочешь, чтобы Виндоус тебе из числа 9999 диалог создало? Телепатически видимо...
А ресурс-то диалога где? Не бывает ресурсов в статических библиотеках... Конечно, ты мог бы засунуть диалог в проект-приложение, но тогда выделение кода диалога в статическую либу теряет смысл. Короче, если хочешь сделать библиотекой нечто, имеющее ресурсы, то это должна быть DLL. -------------------- ... |
|||
|
||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
А можно в двух словах как правильно создать такой проект. Никогда не приходилось делать ни статических ни динамических библиотек, тем более с ресурсами.
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Да просто визардом сделай - он тебе все нарисует, в том числе и ресурсы, куда ты сможешь добавлять свои элементы. Между проектом-приложением и проектом-DLL нет особых различий - с точки зрения, как там код пишется.
-------------------- ... |
|||
|
||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
Создал новый проект MFC DLL типа Regular DLL with MFC statically linked - GraphRealTime
Добавил ресурс-диалог IDD_DIALOG_GRAPHSETTINGS. Создал класс для этого диалога CGraphRTDlg. Собрал проект - получилась либка и дллка. В проекте-приложении линковщику на вход даю эту либку, включаю GraphRTDlg.h и создаю экземпляр CGraphRTDlg graph. Компилирую - error C2065: 'IDD_DIALOG_GRAPHSETTINGS' : undeclared identifier |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Вообще-то это элементарный C - разобраться с неопределенным символом. Значит, его нет в области видимости вызова.
А вообще, есть подозрение насчет неправильного проектирования. На кой, спрашивается, ты ид-р ресурса диалога выставляешь на всеобщее обозрение? Это личное дело диалога - из кого себя создавать. Возможно, дело в дурацкой манере MFC-визарда в определение диалога засовывать константу IDD = IDD-твой_ресурс. Убери нафик. И разберись с основами языка сначала. -------------------- ... |
|||
|
||||
| voov |
|
||||||||||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
Ну вот, приехали...
Это все понятно, но я не знаю как создаются дллки, потому и спрашиваю. Убрал из определения диалога константу IDD = IDD_DIALOG_GRAPHSETTINGS Конструктор диалога
поменял на
Теперь проект-приложение компилируется нормально. Но линковщик ругается на вызовы:
|
||||||||||
|
|||||||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Правильно, потому что класс диалога у тебя не экспортирован. Чтобы вызвать функцию из DLL она должна быть экспортирована. Способов по большому способу 2: через def-файл и через спецификации функций (__declspec(dllexport)).
На мой взгляд, второй удобнее. Писать подробно нету сил, поищи по форуму, эти вопросы обсуждались. И еще - сделай свою DLL не Regular, а Extension - если ты не собираешься ее использовать с другими не MFC-приложениями, жить будет проще. Какие слова нужно поменять в настройках не помню, проще сделать заново визардом. Больше помочь не смогу - уезжаю, так что может кто другой подхватит. -------------------- ... |
|||
|
||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
ок. спасибо за помощь. хорошего отдыха!
|
|||
|
||||
| voov |
|
||||||||||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
По экспорту нашел http://forum.vingrad.ru/topic-166399.html. Сделал как там написано. В хедере диалога GraphRTDlg.h добавил:
Класс диалога теперь определяется так
Библиотека собралась. Собралось и приложение, использующее эту ДЛЛку, правда выдало один варнинг:
Запустил приложение, пытаюсь открыть диалог - ничего не выходит. DoModal попрежнему возвращает -1. Кроме того при завершении приложения вылетает сообщение
Вопрос остается открытым. Как засунуть диалог и его класс в ДЛЛку, а затем из приложения вызвать этот диалог? |
||||||||||
|
|||||||||||
| voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
Проблема решена!
Дело было в том, что мое приложение собиралось с настройкой Use MFC in a Static Library. Я вычитал в книге, что в этом случае ДЛЛ должна быть не MFC Extension, а Regular. Итак, собрал библиотеку Regular с Use MFC in a Static Library и приложение с Use MFC in a Static Library, диалог запускается! Пробовал также делать библиотеку MFC Extension, а приложение - Use MFC in a Shared DLL. Так тоже работает. |
|||
|
||||
| suvolod |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 20.8.2005 Репутация: 1 Всего: 1 |
del
Это сообщение отредактировал(а) suvolod - 19.2.2011, 21:33 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |