Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызвать диалоговое окно из статической библиотеки, не появляется диалоговое окно 
V
    Опции темы
voov
Дата 24.4.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


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

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



Суть в следующем.
1. В одном проекте создан класс, отвечающий за отрисовку графика, и диалоговое окно с настройками для этого класса. Проект собран как статическая библиотека. 
2. Второй проект (собирается как приложение) - диалог с окошком для графика и др. контролами. Подключена библиотека из первого проекта, график рисуется, но когда я вызываю диалог с настройками графика, ничего не происходит...  .DoModal() возвращает -1.

Что нужно сделать, чтобы диалог появился?
PM MAIL   Вверх
Earnest
Дата 24.4.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А можно узнать, как ты ресурс диалога в статическую библиотеку затолкал?


--------------------
...
PM   Вверх
voov
Дата 24.4.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


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

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



Сначала я создал проект как МФС приложение, потом в настройках поменял тип конфигурации на Static Library (.lib).

Проект, который использует эту библиотеку ругался на неопределенную IDD_GRAPHREALTIME_DIALOG. Так я ее определил в проекте библиотеки с тем же номером, что и в Resource.h
Код

#define IDD_GRAPHREALTIME_DIALOG    9999

Это неправильно?

Или для такой цели нужно использовать динамическую библиотеку как написано в http://forum.vingrad.ru/forum/topic-179955

Это сообщение отредактировал(а) voov - 24.4.2008, 17:40
PM MAIL   Вверх
Earnest
Дата 24.4.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну, маладэц, слов нет... Ты хочешь, чтобы Виндоус тебе из числа 9999 диалог создало? Телепатически видимо...
А ресурс-то диалога где? Не бывает ресурсов в статических библиотеках...
Конечно, ты мог бы засунуть диалог в проект-приложение, но тогда выделение кода диалога в статическую либу теряет смысл.
Короче, если хочешь сделать библиотекой нечто, имеющее ресурсы, то это должна быть DLL.


--------------------
...
PM   Вверх
voov
Дата 24.4.2008, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


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

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



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


Эксперт
****


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

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



Да просто визардом сделай - он тебе все нарисует, в том числе и ресурсы, куда ты сможешь добавлять свои элементы. Между проектом-приложением и проектом-DLL нет особых различий - с точки зрения, как там код пишется.


--------------------
...
PM   Вверх
voov
Дата 24.4.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


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


Эксперт
****


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

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



Вообще-то это элементарный C - разобраться с неопределенным символом. Значит, его нет в области видимости вызова.
А вообще, есть подозрение насчет неправильного проектирования. На кой, спрашивается, ты ид-р ресурса диалога выставляешь на всеобщее обозрение? Это личное дело диалога - из кого себя создавать. Возможно, дело в дурацкой манере MFC-визарда в определение диалога засовывать константу IDD = IDD-твой_ресурс. Убери нафик.
 И разберись с основами языка сначала.


--------------------
...
PM   Вверх
voov
Дата 25.4.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


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

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



Цитата

И разберись с основами языка сначала.

Ну вот, приехали... 

Цитата

Вообще-то это элементарный C - разобраться с неопределенным символом. Значит, его нет в области видимости вызова.

Это все понятно, но я не знаю как создаются дллки, потому и спрашиваю. 

Убрал из определения диалога константу IDD = IDD_DIALOG_GRAPHSETTINGS
Конструктор диалога
Код

CGraphRTDlg::CGraphRTDlg(CWnd* pParent /*=NULL*/) : CDialog(CGraphRTDlg::IDD, pParent) {
}

поменял на 
Код

CGraphRTDlg::CGraphRTDlg(CWnd* pParent /*=NULL*/) : CDialogIDD_DIALOG_GRAPHSETTINGS, pParent) {
}


Теперь проект-приложение компилируется нормально. Но линковщик ругается на вызовы:
Код

.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall CGraphRTDlg::~CGraphRTDlg(void)" (??1CGraphRTDlg
.obj : error LNK2019: unresolved external symbol "public: __thiscall CGraphRTDlg::CGraphRTDlg(class CWnd *)" (??0CGraphRTDlg@@QAE@



PM MAIL   Вверх
Earnest
Дата 25.4.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Правильно, потому что класс диалога у тебя не экспортирован. Чтобы вызвать функцию из DLL она должна быть экспортирована. Способов по большому способу 2: через def-файл и через спецификации функций (__declspec(dllexport)).
На мой взгляд, второй удобнее. Писать подробно нету сил, поищи по форуму, эти вопросы обсуждались.
И еще - сделай свою DLL не Regular, а Extension - если ты не собираешься ее использовать с другими не MFC-приложениями, жить будет проще. Какие слова нужно поменять в настройках не помню, проще сделать заново визардом.

Больше помочь не смогу - уезжаю, так что может кто другой подхватит.


--------------------
...
PM   Вверх
voov
Дата 25.4.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


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

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



ок. спасибо за помощь. хорошего отдыха!
PM MAIL   Вверх
voov
Дата 25.4.2008, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


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

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



Цитата

И еще - сделай свою DLL не Regular, а Extension - если ты не собираешься ее использовать с другими не MFC-приложениями
Сделал.

По экспорту нашел http://forum.vingrad.ru/topic-166399.html. Сделал как там написано. В хедере диалога GraphRTDlg.h добавил:
Код

#ifdef _RADLL
#define RA_API __declspec(dllexport)
#else
#define RA_API __declspec(dllimport)
#endif
 В проекте ДЛЛки определил макросимвол _RADLL

Класс диалога теперь определяется так
Код

class RA_API CGraphRTDlg : public CDialog

Библиотека собралась. 
Собралось и приложение, использующее эту ДЛЛку, правда выдало один варнинг:
Код

 warning C4275: non dll-interface class 'CDialog' used as base for dll-interface class 'CGraphRTDlg'

Запустил приложение, пытаюсь открыть диалог - ничего не выходит. DoModal попрежнему возвращает -1. Кроме того при завершении приложения вылетает сообщение 
Код

Run-Time Check Failure #2 - Stack around the variable 'dlg' was corrupted.


Вопрос остается открытым. Как засунуть диалог и его класс в ДЛЛку, а затем из приложения вызвать этот диалог?
PM MAIL   Вверх
voov
Дата 29.4.2008, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 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, диалог запускается!  smile 
Пробовал также делать библиотеку MFC Extension, а приложение - Use MFC in a Shared DLL. Так тоже работает.
PM MAIL   Вверх
suvolod
Дата 18.2.2011, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



del

Это сообщение отредактировал(а) suvolod - 19.2.2011, 21:33
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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