Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Проблемы "очистки" ActiveX после закрытия диалогов

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В диалоговоe окнo (MFC) вставлен покупной ActiveX (в интерфейсe только 1 функция; Release и AddRef не в счет)...  
Так вот, после закрытия этого диалога, все модальные диалоги (и MsgBox) перестают быть таковыми + куча других странностей...
Как можна проверить "очистку" от ActiveX после закрытия диалогового окна?
Возможности "хитрого" дебaгa этой проблемы? Другие идеи?

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 18:25 09-01-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mihas83
Скорее всего это связано с отдельной обработкой системных сообщений для клавиш диалога(типа Tab/Shift-Tab) и клавиш рамки (типа Alt-Space). Элементы ActiveX находятся не там, где должны быть оконные хэндлы (в ином адресном пространстве). Очень часто приходится долго и муторно подбирать - какие messages обрабатывать своим окном, а какие отдавать в активную X(кс)-ню.  
 
А настолько активенную, чтобы испортить кому-нибудь MFC написать очень трудно (у меня не получится). Я бы наобарот заплатил деньги, чтобы у меня таких штук даже в Delphi небыло.
 
Сейчас же полно всего бесплатного, которое обычно надёжнее работает и всё в исходниках. Надо только поискать подольше.

----------
Meaning this is something additional.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 21:02 09-01-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pinocchio
Цитата:
А настолько активенную, чтобы испортить кому-нибудь MFC написать очень трудно  
Проэкт не мой. Позвонила коллега. Мучается с этой проблемой...

Цитата:
...связано с отдельной обработкой системных сообщений для клавиш диалога(типа Tab/Shift-Tab) и клавиш рамки (типа Alt-Space). Элементы ActiveX находятся не там, где должны быть оконные хэндлы (в ином адресном пространстве

Более ясно "разложи" свои мысли. Какие идеи?

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 21:41 09-01-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mihas83
Например ActiveX на всё окно работает просто отлично, за исключением "странного" неумения работать с клавишей Tab. Смотрю WinProc а в ней диалоговые комбинации обрабатываются самостоятельно, а остальные сообщения идут куда надо. Делаю обработчик WMDialogKey и банально диспетчеризирую все сообщения в OleControl, который контролирует ActiveX. Ты говорил что функция у него только одна. Если бы было так, то вставляемый элемент не знал бы ни верхний левый угол ни свою ширину с длиной. Просто этот объект поддерживает стандартные OLE интерфейсы, которые прячутся в исходниках MFC только для удобочитаемости.

----------
Meaning this is something additional.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 08:16 10-01-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pinocchio

Цитата:
Просто этот объект поддерживает стандартные OLE интерфейсы, которые прячутся в исходниках MFC только для удобочитаемости.

Мой первый вопрос коллеге был о функцияx интерфейсa... Так получил ответ, который привел выше... Не уверен, что этот покупной ActiveX написан на MFC... Возможно, завтра узнаю больше...
Идеи "хитрого" дебaгa этой проблемы?

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 11:20 10-01-2004 | Исправлено: mihas83, 11:22 10-01-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Возможно, завтра узнаю больше...

Узнал кое-что: Несколько раз применяются  ловушки - функцией SetWindowsHookEx(...) и "соприкосновение" с ActiveX приводит к тому, что хук на WH_MOUSE перестает срабатывать... Что ему "заходит в голову" не понятно...  
 
Добавлено
...покупной ActiveX написан на Visual Basic.

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 18:14 11-01-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mihas83
Если в хуках дело, то это может быть поправлено установкой своего хука (перед или после, как пропрёт). Бывает, что ламерский подход к действительности заставляет потеть не только ламеров. Хук надо идентить на ту же HInstance. Но это не значит, что виндовские процессы туда не заглянут. Очевидно в хуке происходят сбои с памятью и они некорректно отчитываются о том - обработано ли событие или нет. Я писал не ActiveX, но нечто похожее: отслеживание "пустых" нажатий правого CTRL во всех процессах винды. При этом реальное приложение находилось в DLL, а EXE использовалось как аггрегирующий интерфейс. Эти ребята с Васиком полезли вообще нетуды. Это даже на ассемблере геморойно. Выходов два - рубить все ихние хуки и потихоньку отдавать им события (легче самому написать). Второй - выкинуть на помойку зависающий бинарь, наверно у них есть support - писать туда и требовать деньги назад. Ясно одно - у них в хуках непредсказуемые глюки, поверь моему опыту.

----------
Meaning this is something additional.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 20:53 11-01-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pinocchio Ты немного не понял меня.  
Хуки стоят в основной программе и не на *.ocx (ActiveX)...
При чем, если не открывать этого злополучного диалога с немецким ActiveX... все работает ОК, включая хуки...
Влияние на дальнейшее поведение программы (и на поведение хукoв) закрытого диалога с ActiveX не понятно пока...

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 21:34 11-01-2004 | Исправлено: mihas83, 21:35 11-01-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mihas83
Если в программе хуки, то их не должно быть видно в виндузе, хуки видны когда они в пространстве DLL. Скорее всего ActiveX не закрывается "полностью". Т.е. какие-то интерфейсы висят.

----------
Meaning this is something additional.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 03:31 12-01-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Скорее всего ActiveX не закрывается "полностью".

Чтобы это проверить, попробуй после закрытия диалога удалить ocx. Если не удастся, то он однако не выгрузился. у меня такая беда бывала, когда я через чур активно хуки на систему вешал, с ошибками написав реализацию хука. У меня просто либа цеплялась к чужому приложению и после закрытия основного не выгружалась .

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 07:56 12-01-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pinocchio

Цитата:
Скорее всего ActiveX не закрывается "полностью". Т.е. какие-то интерфейсы висят.
Согласен. "Рыть" надо в этом направлении... Но странное их влияние на хуки...
 
 
Добавлено
ShIvADeSt

Цитата:
Чтобы это проверить, попробуй после закрытия диалога удалить ocx. Если не удастся, то он однако не выгрузился.

Taк стандартным способом коллега их чистит...  
Ты предлагаешь что-то более кардинальное (в смысле метода удаления)?

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 08:20 12-01-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Ты предлагаешь что-то более кардинальное (в смысле метода удаления)?

Нет я имел в виду проверку на полную выгрузку осх. Чтобы точно знать выгрузился он или нет. То есть если файл выгрузился, то его можно удалить. Тогда проблема не в том, что он в памяти висит и что то хучит. А вот если его не удалось удалить, значит кто то не смог его выгрузить и трабла в этом. Я же написал это как способ проверки полной выгрузки осх, а не спсоб решения проблемы Чтобы точно знать есть она в памяти или нет

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:34 12-01-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
 Чтобы точно знать выгрузился он или нет. То есть если файл выгрузился, то его можно удалить.

Теперь понял - надежным "дедовским" способом - в "лоб"...

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 11:02 12-01-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
кто то не смог его выгрузить и трабла в этом.  

- Правильно
Однако нельзя забывать обождать пол минуты. На разных машинах винда по разному управляет свободной памятью. Иногда, чтобы не загружать OCX повторно, система позволяет ему оставаться в "поднятом" состоянии некоторое время после того как счётчик ссылок на интерфейс обнулился.
mihas83
Удаляя OCX с того места где он юзается ты не навредишь системе. Всегда можно иметь файл типа "filename.ocx" и "-.filename.ocx".

----------
Meaning this is something additional.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 16:38 15-01-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Pinocchio

Цитата:
система позволяет ему оставаться в "поднятом" состоянии некоторое время после того как счётчик ссылок на интерфейс обнулился
Точно сказать какое значение времени для данной операционки и конфигурации PC, как я понимаю, нельзя...

Цитата:
Удаляя OCX с того места где он юзается ты не навредишь системе. Всегда можно иметь файл типа "filename.ocx" и "-.filename.ocx".
Уточни свою мысль...
 
 
Добавлено
Твоя _http://www.mtex.ru/software/ с профиля не живая?

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 17:34 15-01-2004
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Точно сказать какое значение времени для данной операционки и конфигурации PC, как я понимаю, нельзя...  

Насколько я помню есть такой ключ в реестре, который указывает ОСи сколдько либе жить полсе обнуления. Сейчас многие твикеры это делают.

Цитата:
Уточни свою мысль...

Я так понял, надо просто иметь резервный файл с каким то левым именем, известным только тебе.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:20 16-01-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Подождем возвращения Pinocchio...

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 12:28 16-01-2004
ollv

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
 Ндас и теперь просмотреть причину того что она осталась подгружена.. Имхо можно запустить файл монитор и просмотреть какие файлы открыты процессом. Тем более, на сколько я понял, после закрытия АктивеИкс  компоненты процесс, подгрузивший его, не завершает работу ? Или завершает работать ? Если завершает и остается от него мусор, .. тогда, да этот способ подойдет наверне для проверки подгружен модуль или нет. Кстати а на какой платформе это происходит ?? Под 9* я встречал пару раз моменты когда после выгрузки процесса остаются невыгруженные модули, под в2к не встречал, если кроме процесса загрузившего его никто больше к нему не обращался.  Хуки (и либы с ними) тоже выгружаются после выгрузки процесса.. и достаточно сложно оставить что-то в памяти (но можно)  
 можно  просмотреть все модули в системе, окна..  
Кстати, вопрос   /*Элементы ActiveX находятся не там, где должны быть оконные хэндлы*/ это что значит, что система мне не выдаст хадла на окно акт_икс, если буду смотреть все окна в системе, или это значит, что я не увижу хандла, если буду просматривать дочерние окна от окна породившего АКтИВ_ИКС?

Всего записей: 165 | Зарегистр. 25-12-2003 | Отправлено: 14:54 16-01-2004
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ollv

Цитата:
Тем более, на сколько я понял, после закрытия АктивеИкс  компоненты процесс, подгрузивший его, не завершает работу ? Или завершает работать ?  

...процесс, подгрузивший ActiveX, не завершает работу.

Всего записей: 7832 | Зарегистр. 15-07-2003 | Отправлено: 08:30 18-01-2004
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mihas83
Не работает, чтобы поменять в профиле, мне придётся давать другой почтовый адрес, т.к. майл ру запретили. А я предпочитаю не иметь других ящиков кроме майл ру по этому профиль будет содержать полностью некорректную информацию, кроме почтового адреса разумеется.
ollv

Цитата:
Элементы ActiveX находятся не там, где должны быть оконные хэндлы (в ином адресном пространстве).

Сам по себе handle, как цифирьку я не имел ввиду (гляди на них сколь угодно долго ). Handle понимается как пронумерованный системой обработчик оконных сообщений. И как обработчик он обязательно принадлежит какому либо процессу и даже потоку. Например он принадлежит чужой программе которая вызывает мой ActiveX. Как же тогда я отработаю нажатие Alt-Space, которое в первую очередь летит в чужое адресное пространство и там обрабатывается библиотекой MFC, как событие по умолчанию, вызывающее системное меню окна? Как может ActiveX получать события, если ему их никто не отдаёт?

----------
Meaning this is something additional.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 09:58 20-01-2004
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Проблемы "очистки" ActiveX после закрытия диалогов


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru