![]() |
|
![]() ![]() ![]() |
|
Finarfin |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.6.2009 Репутация: нет Всего: нет |
Я пишу dll плагина-отладчика для Mathcad. Вот так это всё делается (на всякий случай).
Есть успешно работающая 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, 01:31 |
||||||
|
|||||||
Finarfin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.6.2009 Репутация: нет Всего: нет |
Так, во-первых я ступил с тем, что каждый COM компонент считается зарегестрированным один раз по тому пути, по которому он был зареген в последний раз. Поэтому если надо перерегестрировать в другом месте, то надо видимо заново помещать компонент в диалог. Только непонятно куда лучше его класть - к dll или к экзешнику...
... хотя экзешнику с этим компонентом пофигу где он зареген, работает если OCX лежит в той же директории... Вобщем продолжаю ![]() Это сообщение отредактировал(а) Finarfin - 22.7.2010, 23:00 |
|||
|
||||
Finarfin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.6.2009 Репутация: нет Всего: нет |
Что то я подозреваю что где-нибудь слажал в классе диалога....
Господа, взгляните незамыленным взглядом...
Если кто-то мог бы и сам проект посмотреть, то вообще чудно. Но, боюсь, требуется Mathcad 14 для погружения в ситуацию. Проект в аттаче Присоединённый файл ( Кол-во скачиваний: 5 ) ![]() |
|||
|
||||
ivanychhh |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 31.8.2011 Репутация: нет Всего: нет |
Судя по дате последнего поста, все уже сделано и работает! У меня похожая проблема! Пустой диалог открывается, стоит навесить на него ActiveX, так все ломается.
Подскажи пожалуйста! Как решил проблему?
Без активХ диалог поднимается, с АктивХ Выдается соответствующий месседжбокс, и диалог не поднимается... Это сообщение отредактировал(а) ivanychhh - 31.8.2011, 15:41 |
|||
|
||||
Finarfin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.6.2009 Репутация: нет Всего: нет |
Проблема решена отказом от элемента ActiveX в том плагине который я тогда писал.
Кстати вот он. Так что мой ответ – не знаю ![]() |
|||
|
||||
Finarfin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.6.2009 Репутация: нет Всего: нет |
Ой. Стоп. Эта тема про вызов диалога из DLL. Если у тебя проблемы с вызовом диалога с элементом не из dll а из приложения то это совсем другая проблема. Там надо в самом приложении, откуда вызывается диалог разрешить ActiveX.
|
|||
|
||||
ivanychhh |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 31.8.2011 Репутация: нет Всего: нет |
Да вот как раз в ДЛЛ-ку и надо обернуть этот активХ. При чем, длл-ка должна привязываться к приложению явным образом, т.е. на лету. Чтоб ее отсутствие(за ненадобностью) не влияло на работу приложения, т.к. работать с этой дллкой и этим элементом, будут всего 4 компа, заказчика. И выпускать для них какие-то спецверсии, как-то не комильфо. Ну ладно, буду ковать дальше сам. Если что получится, напишу. Спасибо!
|
|||
|
||||
ivanychhh |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 31.8.2011 Репутация: нет Всего: нет |
Решил задачку. У меня нет отдельного потока, в котором должен открываться этот диалог с АктивХ. Ниже приведу свой рецепт. Может кому-то поможет. Помощь в решении своей проблемы я нашел здесь.
И так. Как открыть диалог с контролом ActiveX из MFC Dll: 1. Создаем проект MFC DLL. (Можно со статическим подключением MFC кому как нравится.) 2. Сдобавляем в ресурсы диалог, и создаем для него класс. 3. Добавляем активХ контрол (в VS 2008, выбрав в контекстном меню соответствующий пункт). 4. Создаем для него переменную (все тоже контекстное меню в помощь). 5. Добавляем в главный срр-шник Dll экспортную функцию.
6. В Функции InitInstace, нашей Dll, делаем следующее:
7. Компилируем и вроде все готово. вот так я вызываю этот метод из Dll, не в тему, но вдруг будет нужно.
|
||||||
|
|||||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |