Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Visual C++/MFC/WTL > Диалог с ActiveX в dll с использ-ем общей DLL MFC |
Автор: Finarfin 22.7.2010, 01:25 | ||||||
Я пишу dll плагина-отладчика для Mathcad. http://twt.mpei.ru/ochkov/Mathcad_14/Chapter6/index.html#_Toc163715518 это всё делается (на всякий случай). Есть успешно работающая dll, по команде из Mathcad`а создающая интерфейсный поток с модальным диалогом отладчика, и по другой команде его завершающая. DLL - "обычная с использованием общей DLL MFC". Резво так окошко вылезает и прячется ![]() Дальше мне надо добавить в диалог компонент ActiveX (NTGraph). Exe-шники с этим компонентом работают. Соответствующий OCX регистрирую (успешность регистрации подтверждается отсутствием характерной ошибки Debug Assertion Failed! Program: C:\блаблабла.exe File: блаблабла\occcont.cpp Line: 926). Но окошко появляться не жалает. Никаких runtime error, просто не появляется. Пробовал другие ActiveX на диалог наляпывать - всё одно: без компонентов - робит, с компонентами - не робит. КОД
В классе потока CMyUIThread,
И в классе вызываемого потоком модального окна
Вообще диалог создан редактором ресурсов VS В основном всё поумолчательное ОТЛАДКА При создании потока проходит конструктор диалога CAdvDlg Доходит до myDlg.DoModal(); в CMyUIThread::InitInstance() До BOOL CAdvDlg::OnInitDialog() не доходит. Просто передает управление маткаду, так и не показав окно. Вглубь не могу отследить, ибо "Не загружена символьная информация ни для одного фрейма стека вызовов. Невозможно показать исходный код." Вот. Требуется брэйншторминг. Задача осложняется тем, что я могу чинить только свою сторону и не знаю что там делает Mathcad, потому что я его не писал ![]() Может вообще не так делаю? Никогда не втыкал ActiveX в dll. |
Автор: Finarfin 22.7.2010, 22:36 |
Так, во-первых я ступил с тем, что каждый COM компонент считается зарегестрированным один раз по тому пути, по которому он был зареген в последний раз. Поэтому если надо перерегестрировать в другом месте, то надо видимо заново помещать компонент в диалог. Только непонятно куда лучше его класть - к dll или к экзешнику... ... хотя экзешнику с этим компонентом пофигу где он зареген, работает если OCX лежит в той же директории... Вобщем продолжаю ![]() |
Автор: Finarfin 22.7.2010, 23:53 | ||
Что то я подозреваю что где-нибудь слажал в классе диалога.... Господа, взгляните незамыленным взглядом...
Если кто-то мог бы и сам проект посмотреть, то вообще чудно. Но, боюсь, требуется Mathcad 14 для погружения в ситуацию. Проект в аттаче |
Автор: ivanychhh 31.8.2011, 15:41 | ||
Судя по дате последнего поста, все уже сделано и работает! У меня похожая проблема! Пустой диалог открывается, стоит навесить на него ActiveX, так все ломается. Подскажи пожалуйста! Как решил проблему?
Без активХ диалог поднимается, с АктивХ Выдается соответствующий месседжбокс, и диалог не поднимается... |
Автор: Finarfin 31.8.2011, 16:22 |
Проблема решена отказом от элемента ActiveX в том плагине который я тогда писал. Кстати http://moryakin.tk/priboristu/otladchik_dlya_mathcad.html. Так что мой ответ – не знаю ![]() |
Автор: Finarfin 31.8.2011, 16:57 | ||
Ой. Стоп. Эта тема про вызов диалога из DLL. Если у тебя проблемы с вызовом диалога с элементом не из dll а из приложения то это совсем другая проблема. Там надо в самом приложении, откуда вызывается диалог разрешить ActiveX.
|
Автор: ivanychhh 1.9.2011, 08:04 |
Да вот как раз в ДЛЛ-ку и надо обернуть этот активХ. При чем, длл-ка должна привязываться к приложению явным образом, т.е. на лету. Чтоб ее отсутствие(за ненадобностью) не влияло на работу приложения, т.к. работать с этой дллкой и этим элементом, будут всего 4 компа, заказчика. И выпускать для них какие-то спецверсии, как-то не комильфо. Ну ладно, буду ковать дальше сам. Если что получится, напишу. Спасибо! |
Автор: ivanychhh 2.9.2011, 08:09 | ||||||
Решил задачку. У меня нет отдельного потока, в котором должен открываться этот диалог с АктивХ. Ниже приведу свой рецепт. Может кому-то поможет. Помощь в решении своей проблемы я нашел http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/c177b1d1-53df-418e-99c2-c87518e2d760. И так. Как открыть диалог с контролом ActiveX из MFC Dll: 1. Создаем проект MFC DLL. (Можно со статическим подключением MFC кому как нравится.) 2. Сдобавляем в ресурсы диалог, и создаем для него класс. 3. Добавляем активХ контрол (в VS 2008, выбрав в контекстном меню соответствующий пункт). 4. Создаем для него переменную (все тоже контекстное меню в помощь). 5. Добавляем в главный срр-шник Dll экспортную функцию.
6. В Функции InitInstace, нашей Dll, делаем следующее:
7. Компилируем и вроде все готово. вот так я вызываю этот метод из Dll, не в тему, но вдруг будет нужно.
|