ActiveX, SetWindowsHookEx, DevExpress - не отрабатывают hook(и)

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

Всем добрый день!

Вопрос у меня конечно специфический, но мало ли кто-нить всетаки сталкивался с этой проблемой....

Использую в свой проге компоненты от Developer Express для реализации меню и плавающих панелей. Использую я эти компоненты как в основном приложении, так и в динамически подгружаемых ActiveX которые располагаются в нескольких *.ocx файлах. В компонентах DevExpres определены Hook(и) на мышку, клаву и т.д. для того чтобы закрывать подменю когда происходит например тык в где-либо не в меню, так вот после того как я гружу 2-3 библиотеки ocx в которой происходит установка тех же Hook(ов) для решения тех же проблем но внутри ActiveX окон происходит так что основное приложение перестает получать эти Hook(и). В каждой процедуре срабатывающей на Hook проверил, вызов следующего hook есть, однако к hook основного приложения не срабатывает. Причем он не срабатывает только когда начинаю перекликиваться с одного подменю на другое....

Да и еще, ошибка проявляется только под win 2000, под win XP все ОК и hook устанавливается для текущего потока.

Буду рад любому совету, может можно что-то проверить доп. чтобы понять почему же он не срабатывает, или есть какие-либо нюансы при работе с hook под win2000.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Пабло, разработчики DevExpress хотели бы знать, какие компоненты и контролы используются в программе. Конкретно версия, название, и т.п.
It's a long way to the top if you wanna rock'n'roll
Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

Я использую ExpressBars 5.1

Т.е. у меня есть меню в основной форме и в ActiveX формах, которые отображаются в MDI окнах основного окна, когда я начинаю прыгать с одного подменю основной формы на подменю в ActiveX то первый раз меню основной формы закрывается, а затем остается и появляется глюк два открытых меню, затем при тыке в пустое место вылетает Invalid Handle, там идет попытка освободить TdxBarShadowPart

В чем может быть засада?
Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

Вообще используется в программе несколько пакетов кроме указанного выше используются еще:
ExpressPage Control 2.1
ExpressQuantiumTreeList 3.2.2
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Пабло, пишите баг в СЦ с проектом http://www.devexpress.com/sc - туда может зарегистрироваться и писать любой.
5-е бары имеют ряд ограничений, так как должны располагаться на форме. В случае ОСХ эта форма имеет парента. На parented forms в 5-х барах наложено ограничение, которое мы пытаемся снять в 6-ой версии.
It's a long way to the top if you wanna rock'n'roll
Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

Вот черт, я использую ExpressBars практически во всех своих ocx, у меня проект на них построен, щас идут просто какие-то неуловимые глюки и именно с ExpressBars:
1) глюк с подменю когда загружаешь много ActiveX где используется TdxBarManager то при перескакивании с одного подменю на другое получаю вылет своей системы, вернее сначал где-то сначало эти подменю перестают закрываться и потом падение системы, где-то конкретное зависание и т.д.
2) Частенько при создание ActiveX формы вылетает ошибка "Дочерние MDI окна не могут иметь меню"
3) был глюк под win2000 при открытии дочернего окна не отрисовывались кнопки системного меню

вообщем то вся засада в этих hook(ах) т.к. в тех ошибках в которых я разобрался были из-за того что hook(и) не срабатывали...


И главное у меня сервис пак в конце недели а тут такие падения системы идут... что делать я незнаю, уже всю голову себе переломал...

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

А ты можешь сказать мне пакеты или компоненты которые критичны или наоборот не критичны к использованию в ActiveX формах?
Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

Можно еще также узнать на какие Bar(ы) наложены ограничения?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):я бы конечно написал в devexpress но для того чтобы мне точно описать ошибку, как она проявляется и как ее получить, нужно много времени, которого сейчас просто нет...
лучше напиши в SC. удаленно все-равно ничем не помочь, без твоего проекта никто тут не разберется... а фикс, если удастся пофиксить быстро, то может и так вышлют (если, конечно, есть лицензия)
&quot писал(а):Можно еще также узнать на какие Bar(ы) наложены ограничения?
ну, так сходу всего и не перечислишь... не то, чтобы их много, просто многие вещи могут проявляться достаточно специфически и к тому же, многое постоянно улучшается, скоро будут 6-е бары, там что-то будет лучше.
It's a long way to the top if you wanna rock'n'roll
Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

Вообщем то окончательно я понял одно, глюки происходят у меня из-за того что не отрабатывали нижеприведеные hook(и):

if KeyboardHookHandle = 0 then
KeyboardHookHandle :=
SetWindowsHookEx(WH_KEYBOARD, dxBarKeyboardHook, 0, GetCurrentThreadId);
if MouseHookHandle = 0 then
MouseHookHandle := SetWindowsHookEx(WH_MOUSE, dxBarMouseHook, 0, GetCurrentThreadId);
if WndProcHookHandle = 0 then
WndProcHookHandle :=
SetWindowsHookEx(WH_CALLWNDPROC, dxBarWndProcHook, 0, GetCurrentThreadId);

это код из dxBar.pas из метода RegisterdxBarManager

и не срабатывают hook(и) под Win2000 и только в исполняемом модуле, вернее они срабатывают но не всегда, зато вот во всех *.ocx где находятся мои ActiveX формы с меню от ExpressBars hook срабатывают стабильно. Это я обнаружил с помощью логирования, когда пытался проследить какой hook и где не срабатывает и проверить везде ли вызывается CallNextHookEx...

Из-за того что не всегда срабатывали Hook(и) в exe происходили точно две ошибки, а именно:
1) Подменю основного окна исполняемого модуляе(exe) оставалось висеть когда я тыкал на другое подменю ActiveX окна, затем в результате происходила ошибка "неверный дискриптор окна", а именно было попытка убить окно с несуществующим Handle и мое приложение отваливалось...
2) Иногда терялось системное меню(свернуть/развернуть/закрыть) для MDI окон и происходило это опять же из-за того что не отрабатывали Hook(и)

никогда не работал с Hook(ами) и не знаю никаких особенностей работы с ними, но Hook(и) нестабильно срабатывали именно только в исполняемом модуле и именно под Win2000, под XP например все работает хорошо.

От ошибки избавился пока что определив Hook(и) в одной из dll библиотек в которой реализованы COM объекты и дергаю посредством внутреннего интерфейса соответствующие функции в dxBar исполняемого модуля. Идиотизм конечно, но блин, пока работает, будем тестить... Но это самый ужасный костыль который мне когда-либо приходилось делать.... вообщем пока не разберусь с Hook(ами) оставлю пока так...
Кстати, что самое интересное попробовал сделать отдельную dll(ку) dxHook.dll в которой хотел устанавить эти Hook(и) и вызывать по ним соответствующие методы в exe... и как вы думаете каков результат? неработает :) это прямо колдовство какое-то, зате если я hook(и) определяю в dll(ке) в которой реализованы различные мои COM объекты и дергаю соответствующие функции в исполняемом модуле посредством интерфейса, то работает... кстати этот последний вариант был сначало тестовым, типа заработает не заработает, вроде заработало, потом написал dll(ку) dxHook.dll и не работает :)
Берд...

вообщем то буду признателен за любую информацию по работе с Hook(ами) под win2000
Пабло
Сообщения: 33
Зарегистрирован: 15 авг 2006, 15:22

И всетаки так и неудается мне понять почему происходят глюки...

Начал разбираться для начала с первой проблемой, которая проявлялась при перепрыгивании с одного подменю на другое... в результате выяснил что происходит сбой из-за того что при выполнении функции DestroyWindow для окна подменю(TdxSubMenuControl) не приходят сообщения WM_WINDOWPOSCHENGING, WM_WINDOWPOSCHANGED, WM_DESTROY и WM_NCDESTROY, в результате чего при освобождении класса TdxSubMenuControl возникает ошибка "Неверный дескриптор окна" код:1400. Причем это зависит от того как много ActiveX модулей у меня загружено..., если их относительно немного то сообщения приходят, если много то неприходят...

Пробовал написать тестовый пример с 6-ю ActiveX формами использующие DevExpress, это конечно очень мало относительно моего приложения но все же. В ActiveX формах добавил все компоненты используемые мной в ActiveX из ExpressBars(TdxBarButton, TdxBarSubItem, TdxBarEdit, TdxBarCombo, TdxBarContainedItem), натолкнуться на ошибку в тестовом примере так и неудалось...

сижу выдумываю из-за чего могу не получать выше указанный сообщения...

кто-нибудь может предложить какие-нить версии? в какую сторону копать?
Ответить