| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Размещение в DLL основной программы с диалогом |
| Автор: DEN1 8.12.2008, 19:05 | ||||
| Доброго времени суток. Эта тема поднимается уже не в первый раз, но точного и вразумительного ответа я так нигде и не нашёл. Ситуация следующая. Есть программа (Unigraphics сокращ. UG) которую можно автоматизировать программами на С/С++. Взаимодействие происходит через DLL. UG вызывает DLL, в которой должна находиться функция ufusr(). Далее посредством классов самого UG осуществляется с ним взаимодействие. (UG Open входит в состав UG и имеет все необходимые заголовочные файлы). Для взаимодействия с пользователем непосредственно в UG имеется User Styler для создания диалоговых окон и использования их в DLL. Но процесс создания диалогов посредством этого модуля очень трудоёмкий и не годится для создания сложных диалогов. Проблема: Если в DLL в функции ufusr() создавать диалоговое окно из ресурса классическим способом:
окно не создаётся и выдаётся ошибка (в Debug версии DLL) :
24-я строка это AfxGetResourceHandle() Причём это возникает только при вызове этой DLL из UG или из командной строки: rundll32 dll.dll, ufusr Если использовать ufusr() из своего .exe, то диалог создаётся. Можно ли решить данную проблему? |
| Автор: Earnest 9.12.2008, 08:58 |
| У тебя Extenion DLL? И приложение тоже MFC-based? Тогда ответ: не пользоваться MFC. Или, как минимум, сделать Regular DLL. |
| Автор: DEN1 9.12.2008, 10:26 |
| Т.е. MFC не удастся пользоваться совсем? Просто хотелось бы не отвлекаться на написание оболочки программы вручную и пользоваться возможностями визуальной среды разработки. Я раньше писал в Borland, но lib файлы UG не все конвертируются из COFF и использовать множество функций там просто невозможно. |
| Автор: Earnest 10.12.2008, 09:28 | ||
| Можно использовать MFC, но нельзя делать DLL типа Extension. А в Regular DLL нужно в каждой точке входа (т.е. в каждой экспортируемой функции) устанавливать Module State - вызовом AFX_MANAGE_STATE(AfxGetStaticModuleState( )). Extension DLL от Regular имеет отличие только на уровне MFC. В первой определен макросимвол AFXEXT, а DLLMain имеет характерный вид - примерно такой:
Этот код генерирует визард прр создании проекта. В Regular DLL DllMain обычно нет (т.е. конечно, есть, но не в твоем коде), а есть экземляр приложения, похожий на тот, к-й создается для EXE. Набери в MSDN Regular DLL и почитай, там немного. Коротко говоря, лучше, чтобы твой диалог запускался экспортируемой функцией из твоей же DLL, а эта функция д. начинаться с вызова AFX_MANAGE_STATE(AfxGetStaticModuleState()); |
| Автор: DEN1 10.12.2008, 10:27 | ||||
Большое спасибо. Всё заработало. DLL была Regular, но я не использовал
Хотя это описано в MSDN в разделе "Regular DLLs Dynamically Linked to MFC" в самом конце. Подводя итоги, для того чтобы в DLL разместить автономно работающий диалог/форму необходимо: 1. Чтобы DLL была типа Regular 2. Экспортируемые функции были защищены с помощью AFX_MANAGE_STATE(AfxGetStaticModuleState()) Например:
Ещё раз спасибо Earnest за решение вопроса. |