MFC DLL + CDialog
От: whitesail  
Дата: 16.03.05 02:30
Оценка:
Граждане, я новичок, прошу прощения, если вопрос местами ( или полностью ) бестолковый. Поиск ответа в сети приводит к длительному детальному разбору сопутствующих тем, а мне нужно быстрое решение небольшой ( как мне кажется ) проблемы.

Имеется MFC приложение, функциональноть которого пополняется dllками по мере их написания. Собственно проблема заключается в подключении этих dllэк.

Что я делаю неверно? ( или не делаю того, что нужно )

1. Создал MFC Regular Dll, добавил в ресурсах окно, создал класс этого окна, наследованный от CDialog, скомпилил. Получил dll.dll, dll.lib, dll.def, dll.h и др.

2. Создал MFC Aplication , к которому вознамерился подключить dll из пункта 1. В линкер добавил dll.dll, подключил h-файл класса окна (dialog.h) и

Dialog dlg;
dlg.DoModal();

Скажите, это вообще правильный подход или идея неверна в корне?

Если в принципе все верно, то как обойти проблему: компилятор спотыкается на идентификаторе окна enum { IDD = IDD_DIALOG1 }; в подключенном в проект h файле.

Если данный вопрос уже обсуждался ( я не нашел ) киньте, пожалуйста, линк.
Спасибо.
Re: MFC DLL + CDialog
От: Аноним  
Дата: 16.03.05 07:20
Оценка:
Здравствуйте, whitesail
Сам реализовывал что-то подобное, но у меня модули подгружались динамически, в них содеражились необходимые функции, одна из них как раз выводила на экран диалоговую форму.
Если хочешь — стукни в 193919997, объясню как сделал, а то кода не осталось.
Re: MFC DLL + CDialog
От: L2-Max Украина  
Дата: 16.03.05 12:45
Оценка:
Здравствуйте, whitesail, Вы писали:

W>Граждане, я новичок, прошу прощения, если вопрос местами ( или полностью ) бестолковый. Поиск ответа в сети приводит к длительному детальному разбору сопутствующих тем, а мне нужно быстрое решение небольшой ( как мне кажется ) проблемы.


W>Имеется MFC приложение, функциональноть которого пополняется dllками по мере их написания. Собственно проблема заключается в подключении этих dllэк.


W>Что я делаю неверно? ( или не делаю того, что нужно )


W>1. Создал MFC Regular Dll, добавил в ресурсах окно, создал класс этого окна, наследованный от CDialog, скомпилил. Получил dll.dll, dll.lib, dll.def, dll.h и др.


W>2. Создал MFC Aplication , к которому вознамерился подключить dll из пункта 1. В линкер добавил dll.dll, подключил h-файл класса окна (dialog.h) и


W>Dialog dlg;

W>dlg.DoModal();

W>Скажите, это вообще правильный подход или идея неверна в корне?


W>Если в принципе все верно, то как обойти проблему: компилятор спотыкается на идентификаторе окна enum { IDD = IDD_DIALOG1 }; в подключенном в проект h файле.


И будет "спотыкаться" ведь твой IDD_DIALOG1 объявлен в resourse.h проэкта dll , а в exe проэкте подключается свой resource.h где ясен этого макроса нет(и вообще ресурсы в одном потоке абсолютно бессмысленны для другого), чтобы обойти это , в .h файле dll- диалога объяви

enum{IDD};


а в .cpp файле в списке инициализации конструктора, или в теле присвой IDD=IDD_DIALOG1

теперь в exe можно будет узнать ID по IDD

к стати возможно ты столкнешся с еще одной проблеммой, иногда AfxGetStaticModuleState()
не срабатывает(толи глюки толи у меня руки кривые), прийдется вручную менять текущий handle ресурса


W>Если данный вопрос уже обсуждался ( я не нашел ) киньте, пожалуйста, линк.

W>Спасибо.
L2-Max
Re[2]: MFC DLL + CDialog
От: whitesail  
Дата: 17.03.05 17:43
Оценка:
Здравствуйте, L2-Max, Вы писали:


LM>И будет "спотыкаться" ведь твой IDD_DIALOG1 объявлен в resourse.h проэкта dll , а в exe проэкте подключается свой resource.h где ясен этого макроса нет(и вообще ресурсы в одном потоке абсолютно бессмысленны для другого), чтобы обойти это , в .h файле dll- диалога объяви


LM>
LM>enum{IDD};
LM>


LM>а в .cpp файле в списке инициализации конструктора, или в теле присвой IDD=IDD_DIALOG1


м. в теле какого именно цпп? ( какого класса ? )


LM>теперь в exe можно будет узнать ID по IDD


LM>к стати возможно ты столкнешся с еще одной проблеммой, иногда AfxGetStaticModuleState()


Она мне тоже понадобится??? Видимо, я просто не понимаю устройство сборки проекта с ресурсами в длл. Может , Вы можете подсказать альтернативный путь решения проблемы, который "сто раз" проверен. Чтобы не разбираться в деталях длл и пр. Оно, конечно, малодушно, понимаю, но конечная у меня цель не стать богом программерства, а решить вполне конкретную задачу.

Или , если все же ликбеза не избежать — не скажете, что почитать ( чем ближе к делу тем лучше)

И, конечно, большое спасибо за ответ.
Re[2]: MFC DLL + CDialog
От: whitesail  
Дата: 17.03.05 20:18
Оценка:
W>>Если в принципе все верно, то как обойти проблему: компилятор спотыкается на идентификаторе окна enum { IDD = IDD_DIALOG1 }; в подключенном в проект h файле.

LM>И будет "спотыкаться" ведь твой IDD_DIALOG1 объявлен в resourse.h проэкта dll , а в exe проэкте подключается свой resource.h где ясен этого макроса нет(и вообще ресурсы в одном потоке абсолютно бессмысленны для другого), чтобы обойти это , в .h файле dll- диалога объяви


LM>
LM>enum{IDD};
LM>


LM>а в .cpp файле в списке инициализации конструктора, или в теле присвой IDD=IDD_DIALOG1


LM>теперь в exe можно будет узнать ID по IDD


LM>к стати возможно ты столкнешся с еще одной проблеммой, иногда AfxGetStaticModuleState()

LM>не срабатывает(толи глюки толи у меня руки кривые), прийдется вручную менять текущий handle ресурса

Так, нашлось описалово: кто-нибудь с мозгами ( это не я ) гляньте вот эту страничку www.codeguru.com/Cpp/W-P/dll/article.php/c101/

там как раз про экспорт ресурсов написано , и функция эта ужасная есть. Прокомментируйте этот код ( который там приведен ) может и остальным польза будет. Я бы рад, но не копенгаген.

Спасибо.
Re[3]: MFC DLL + CDialog
От: LuciferMoscow Россия  
Дата: 18.03.05 09:07
Оценка:
Насколько я понимаю проблема еще не решена.
http://forum.sources.ru/index.php?s=c611fdd68734e98d25e027dbeb9619ee&showtopic=43825&view=findpost&p=287052
Re[4]: MFC DLL + CDialog
От: whitesail  
Дата: 18.03.05 10:16
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Насколько я понимаю проблема еще не решена.

LM>http://forum.sources.ru/index.php?s=c611fdd68734e98d25e027dbeb9619ee&showtopic=43825&view=findpost&p=287052

Не сочтите за полный тупизм.. но по ссылке ( даже со всеми метками ) я попадаю на основную страничку форума.. а не на основной топик. Раз уж Вы нашли, будте добры, поясните как найти конкретную тему
Re[5]: MFC DLL + CDialog
От: LuciferMoscow Россия  
Дата: 18.03.05 10:20
Оценка:
Здравствуйте, whitesail, Вы писали:
а так:
http://forum.sources.ru/index.php?showtopic=43825&st=0&#entry287409
Re[6]: MFC DLL + CDialog
От: whitesail  
Дата: 18.03.05 11:49
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, whitesail, Вы писали:

LM>а так:
LM>http://forum.sources.ru/index.php?showtopic=43825&st=0&#entry287409

А вот так работает, спасибо. Я уже видел этот топик и думаю, как воспользоваться кодом..
HINSTANCE hInstExe = AfxGetResourceHandle(); 
AfxSetResourceHandle(::GetModuleHandle(“mydll.dll”));
pDlg2->Create(IDD_DLG2, pDlg );
AfxSetResourceHandle(hInstExe);

в своем случае
Re[6]: MFC DLL + CDialog
От: whitesail  
Дата: 18.03.05 11:51
Оценка:
Здравствуйте, LuciferMoscow

А не осталось кода двух приложений..??
Было бы проще понять.
Re[7]: MFC DLL + CDialog
От: LuciferMoscow Россия  
Дата: 18.03.05 12:25
Оценка:
Здравствуйте, whitesail, Вы писали:

W>Здравствуйте, LuciferMoscow


W>А не осталось кода двух приложений..??

W>Было бы проще понять.
Если остался, то не на этом компе + надо "вырезать" коммерческую тайну
К понедельнику могу сделать, если хочешь.

P.S. AFX_MANAGE_STATE тебя спасет? С ним вроде попроще
Re[8]: MFC DLL + CDialog
От: whitesail  
Дата: 18.03.05 12:34
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, whitesail, Вы писали:


W>>Здравствуйте, LuciferMoscow


W>>А не осталось кода двух приложений..??

W>>Было бы проще понять.
LM>Если остался, то не на этом компе + надо "вырезать" коммерческую тайну
LM>К понедельнику могу сделать, если хочешь.
Да, очень хочу.

LM>P.S. AFX_MANAGE_STATE тебя спасет? С ним вроде попроще

Как угодно. Мне совершенно все равно как. Лишь бы вылез диалог. Кстати, в нем планируются activeX контролы, у которых своих классов полно. Реально ли это?
Re[9]: MFC DLL + CDialog
От: LuciferMoscow Россия  
Дата: 18.03.05 12:40
Оценка:
Здравствуйте, whitesail, Вы писали:

W>Здравствуйте, LuciferMoscow, Вы писали:


LM>>Здравствуйте, whitesail, Вы писали:


W>>>Здравствуйте, LuciferMoscow


W>>>А не осталось кода двух приложений..??

W>>>Было бы проще понять.
LM>>Если остался, то не на этом компе + надо "вырезать" коммерческую тайну
LM>>К понедельнику могу сделать, если хочешь.
W>Да, очень хочу.
OK. Постараюсь не забыть.

LM>>P.S. AFX_MANAGE_STATE тебя спасет? С ним вроде попроще

W>Как угодно. Мне совершенно все равно как. Лишь бы вылез диалог. Кстати, в нем планируются activeX контролы, у которых своих классов полно. Реально ли это?
ХЗ. С комами почти не работал.
Re[8]: MFC DLL + CDialog
От: whitesail  
Дата: 18.03.05 12:54
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, whitesail, Вы писали:


W>>Здравствуйте, LuciferMoscow


LM>P.S. AFX_MANAGE_STATE тебя спасет? С ним вроде попроще


extern __declspec(dllexport) void ShowEditDialog(int &MyData1, int &MyData2)
{
    //ensure we are using our own resources
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    CMyLocalDialog dlg;
    dlg.Arg1 = MyData1; //specific local data for MyLocalDialog
    dlg.Arg2 = MyData2;
    dlg.DoModal();
    MyData1 = dlg.Arg1; //data after processing
    MyData2 = dlg.Arg2;
}


Тут экспорт функции.. а мне нужен класса
Re[7]: MFC DLL + CDialog
От: Аноним  
Дата: 20.03.05 12:28
Оценка:
Здравствуйте, whitesail, это LuciferMoscow
скинь сюда, либо в приват свой мейл. Завтра вышлю пример
Re[9]: MFC DLL + CDialog
От: Giraffe  
Дата: 21.03.05 07:42
Оценка:
Здравствуйте, whitesail, Вы писали:


W>Тут экспорт функции.. а мне нужен класса


Экспорт класса в Regular-DLL не поддерживается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.