![]() |
|
|
![]()
|
|
| DEN1 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 8.12.2008 Репутация: нет Всего: нет |
Доброго времени суток. Эта тема поднимается уже не в первый раз, но точного и вразумительного ответа я так нигде и не нашёл.
Ситуация следующая. Есть программа (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 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
У тебя Extenion DLL? И приложение тоже MFC-based?
Тогда ответ: не пользоваться MFC. Или, как минимум, сделать Regular DLL. -------------------- ... |
|||
|
||||
| DEN1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 8.12.2008 Репутация: нет Всего: нет |
Т.е. MFC не удастся пользоваться совсем? Просто хотелось бы не отвлекаться на написание оболочки программы вручную и пользоваться возможностями визуальной среды разработки. Я раньше писал в Borland, но lib файлы UG не все конвертируются из COFF и использовать множество функций там просто невозможно.
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Можно использовать 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 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 8.12.2008 Репутация: нет Всего: нет |
Большое спасибо. Всё заработало. DLL была Regular, но я не использовал
Хотя это описано в MSDN в разделе "Regular DLLs Dynamically Linked to MFC" в самом конце. Подводя итоги, для того чтобы в DLL разместить автономно работающий диалог/форму необходимо: 1. Чтобы DLL была типа Regular 2. Экспортируемые функции были защищены с помощью AFX_MANAGE_STATE(AfxGetStaticModuleState()) Например:
Ещё раз спасибо Earnest за решение вопроса. |
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |