Граждане, я новичок, прошу прощения, если вопрос местами ( или полностью ) бестолковый. Поиск ответа в сети приводит к длительному детальному разбору сопутствующих тем, а мне нужно быстрое решение небольшой ( как мне кажется ) проблемы.
Имеется 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, объясню как сделал, а то кода не осталось.
Здравствуйте, 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>Спасибо.
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()
Она мне тоже понадобится??? Видимо, я просто не понимаю устройство сборки проекта с ресурсами в длл. Может , Вы можете подсказать альтернативный путь решения проблемы, который "сто раз" проверен. Чтобы не разбираться в деталях длл и пр. Оно, конечно, малодушно, понимаю, но конечная у меня цель не стать богом программерства, а решить вполне конкретную задачу.
Или , если все же ликбеза не избежать — не скажете, что почитать ( чем ближе к делу тем лучше)
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 ресурса
там как раз про экспорт ресурсов написано , и функция эта ужасная есть. Прокомментируйте этот код ( который там приведен ) может и остальным польза будет. Я бы рад, но не копенгаген.
Не сочтите за полный тупизм.. но по ссылке ( даже со всеми метками ) я попадаю на основную страничку форума.. а не на основной топик. Раз уж Вы нашли, будте добры, поясните как найти конкретную тему
Здравствуйте, whitesail, Вы писали:
W>Здравствуйте, LuciferMoscow
W>А не осталось кода двух приложений..?? W>Было бы проще понять.
Если остался, то не на этом компе + надо "вырезать" коммерческую тайну
К понедельнику могу сделать, если хочешь.
P.S. AFX_MANAGE_STATE тебя спасет? С ним вроде попроще
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, whitesail, Вы писали:
W>>Здравствуйте, LuciferMoscow
W>>А не осталось кода двух приложений..?? W>>Было бы проще понять. LM>Если остался, то не на этом компе + надо "вырезать" коммерческую тайну LM>К понедельнику могу сделать, если хочешь.
Да, очень хочу.
LM>P.S. AFX_MANAGE_STATE тебя спасет? С ним вроде попроще
Как угодно. Мне совершенно все равно как. Лишь бы вылез диалог. Кстати, в нем планируются activeX контролы, у которых своих классов полно. Реально ли это?
Здравствуйте, whitesail, Вы писали:
W>Здравствуйте, LuciferMoscow, Вы писали:
LM>>Здравствуйте, whitesail, Вы писали:
W>>>Здравствуйте, LuciferMoscow
W>>>А не осталось кода двух приложений..?? W>>>Было бы проще понять. LM>>Если остался, то не на этом компе + надо "вырезать" коммерческую тайну LM>>К понедельнику могу сделать, если хочешь. W>Да, очень хочу.
OK. Постараюсь не забыть.
LM>>P.S. AFX_MANAGE_STATE тебя спасет? С ним вроде попроще W>Как угодно. Мне совершенно все равно как. Лишь бы вылез диалог. Кстати, в нем планируются activeX контролы, у которых своих классов полно. Реально ли это?
ХЗ. С комами почти не работал.
Здравствуйте, 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
скинь сюда, либо в приват свой мейл. Завтра вышлю пример