Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размещение в DLL основной программы с диалогом 
V
    Опции темы
DEN1
Дата 8.12.2008, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток. Эта тема поднимается уже не в первый раз, но точного и вразумительного ответа я так нигде и не нашёл. 

Ситуация следующая. Есть программа (Unigraphics сокращ. UG) которую можно автоматизировать программами на С/С++. Взаимодействие происходит через DLL. UG вызывает DLL, в которой должна находиться функция ufusr(). Далее посредством классов самого UG осуществляется с ним взаимодействие. (UG Open входит в состав UG и имеет все необходимые заголовочные файлы). Для взаимодействия с пользователем непосредственно в UG имеется User Styler для создания диалоговых окон и использования их в DLL. Но процесс создания диалогов посредством этого модуля очень трудоёмкий и не годится для создания сложных диалогов.

Проблема: Если в DLL в функции ufusr() создавать диалоговое окно из ресурса классическим способом:


Код


DLG dlg;
dlg.DoModal();


окно не создаётся и выдаётся ошибка (в Debug версии DLL) :

Цитата

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: D:\WINDOWS\system32\rundll32.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
Line: 24

----------------------------

24-я строка это AfxGetResourceHandle()

Причём это возникает только при вызове этой DLL из UG или из командной строки: rundll32 dll.dll, ufusr
Если использовать ufusr() из своего .exe, то диалог создаётся. 

Можно ли решить данную проблему?
PM MAIL   Вверх
Earnest
Дата 9.12.2008, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



У тебя Extenion DLL? И приложение тоже MFC-based?
Тогда ответ: не пользоваться MFC. Или, как минимум, сделать Regular DLL. 


--------------------
...
PM   Вверх
DEN1
Дата 9.12.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Т.е. MFC не удастся пользоваться совсем? Просто хотелось бы не отвлекаться на написание оболочки программы вручную и пользоваться возможностями визуальной среды разработки. Я раньше писал в Borland, но lib файлы UG не все конвертируются из COFF и использовать множество функций там просто невозможно. 
PM MAIL   Вверх
Earnest
Дата 10.12.2008, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Можно использовать MFC, но нельзя делать DLL типа Extension.
А в Regular DLL нужно в каждой точке входа (т.е. в каждой экспортируемой функции) устанавливать Module State - вызовом AFX_MANAGE_STATE(AfxGetStaticModuleState( )).
Extension DLL от Regular имеет отличие только на уровне MFC. В первой определен макросимвол AFXEXT, а DLLMain имеет характерный вид - примерно такой:
Код

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    // Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved);

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        // Extension DLL one-time initialization
        if (!AfxInitExtensionModule(NewTracersDLL, hInstance))
            return 0;
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        AfxTermExtensionModule(NewTracersDLL);
    }
    return 1;   // ok
}

Этот код генерирует визард прр создании проекта. В Regular DLL DllMain обычно нет (т.е. конечно, есть, но не в твоем коде), а есть экземляр приложения, похожий на тот, к-й создается для EXE.
Набери в MSDN Regular DLL и почитай, там немного.
Коротко говоря, лучше, чтобы твой диалог запускался экспортируемой функцией из твоей же DLL, а эта функция д. начинаться с вызова AFX_MANAGE_STATE(AfxGetStaticModuleState());




--------------------
...
PM   Вверх
DEN1
Дата 10.12.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо. Всё заработало. DLL была Regular, но я не использовал
Код

 AFX_MANAGE_STATE(AfxGetStaticModuleState())

Хотя это описано в MSDN в разделе "Regular DLLs Dynamically Linked to MFC" в самом конце.

Подводя итоги, для того чтобы в DLL разместить автономно работающий диалог/форму необходимо:
1. Чтобы DLL была типа Regular
2. Экспортируемые функции были защищены с помощью  AFX_MANAGE_STATE(AfxGetStaticModuleState())
Например:
Код

EXPORT __declspec(dllexport) void ufusr()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
Dialog dlg;
dlg.DoModal();
}


Ещё раз спасибо Earnest за решение вопроса.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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