|
Вопрос # 5 713/ вопрос открыт / |
|
Здравствуйте!
Установлен хук на создание окон(WH_CBT). Если главное окно программы порождает дочернее то хук работает, и выполняет все написанные действия. Проблема в том что когда уже открытое дочернее окно пытается породить другое окно то всё не на долго зависает и программа закрывается с предложением отправить отчёт об ошибке.
Код в DLL откоментирован, для более легкого понимания что я делаю.
Класс создаваемого окна которое вызывает ошибку: #32770
Приложение: Переключить в обычный режим- uses
- SysUtils,
- Classes,
- Windows,
- Messages;
-
-
- var
- HookHandle: HHook;
- ParentHandle, WindowHandle1, WindowHandle2, WindowHandle3, WindowHandle4: THandle;
- TId, HLibrary: DWORD;
-
-
- {$R *.res}
-
-
-
- function CBTHook(Code: Integer; WParam, LParam: DWord): Longint; stdcall;
- begin
- Result:=CallNextHookEx(HookHandle, CODE, WParam, LParam);
-
-
- case CODE of
- HCBT_CREATEWND:
- begin
-
- if (PCBTCreateWnd(LParam).lpcs.lpszClass = 'ChildEXEClass') and (WindowHandle1 = 0) then
- begin
- PCBTCreateWnd(LParam).lpcs.cx:= 795;
- PCBTCreateWnd(LParam).lpcs.cy:= 575;
- PCBTCreateWnd(LParam).lpcs.x:= -1;
- PCBTCreateWnd(LParam).lpcs.y:= -10;
- WindowHandle1:= WParam;
- end
- else
- if (PCBTCreateWnd(LParam).lpcs.lpszClass = 'ChildEXEClass') and (WindowHandle2 = 0) then
- begin
- PCBTCreateWnd(LParam).lpcs.cx:= 795;
- PCBTCreateWnd(LParam).lpcs.cy:= 575;
- PCBTCreateWnd(LParam).lpcs.x:= 485;
- PCBTCreateWnd(LParam).lpcs.y:= -10;
- WindowHandle2:= WParam;
- end
- else
- if (PCBTCreateWnd(LParam).lpcs.lpszClass = 'ChildEXEClass') and (WindowHandle3 = 0) then
- begin
- PCBTCreateWnd(LParam).lpcs.cx:= 795;
- PCBTCreateWnd(LParam).lpcs.cy:= 575;
- PCBTCreateWnd(LParam).lpcs.x:= -1;
- PCBTCreateWnd(LParam).lpcs.y:= 420;
- WindowHandle3:= WParam;
- end
- else
- if (PCBTCreateWnd(LParam).lpcs.lpszClass = 'ChildEXEClass') and (WindowHandle4 = 0) then
- begin
- PCBTCreateWnd(LParam).lpcs.cx:= 795;
- PCBTCreateWnd(LParam).lpcs.cy:= 575;
- PCBTCreateWnd(LParam).lpcs.x:= 485;
- PCBTCreateWnd(LParam).lpcs.y:= 420;
- WindowHandle4:= WParam;
- end
- else
-
-
- if PCBTCreateWnd(LParam).lpcs.lpszClass = 'MessageBoxRegisterClass' then
- begin
- PostMessage(WParam, wm_Close, 0, 0);
- end
- else
-
-
- if PCBTCreateWnd(LParam).lpcs.lpszClass = 'LoginWin' then
- begin
- //
- //
- end;
-
- end;
-
-
- HCBT_DESTROYWND:
- begin
-
-
- if WParam = WindowHandle1 then WindowHandle1:= 0 else
- if WParam = WindowHandle2 then WindowHandle2:= 0 else
- if WParam = WindowHandle3 then WindowHandle3:= 0 else
- if WParam = WindowHandle4 then WindowHandle4:= 0 else
- Exit;
- end;
-
-
-
-
-
- end;
- end;
-
-
-
-
-
-
- procedure SetCreateWindowHook; stdcall; export;
- begin
- if HookHandle = 0 then
- begin
- WindowHandle1:= 0;
- WindowHandle2:= 0;
- WindowHandle3:= 0;
- WindowHandle4:= 0;
- HLibrary:= LoadLibrary('MovWin32.dll');
- ParentHandle:= FindWindow('ParentEXEClass',nil);
- TId:= GetWindowTask(ParentHandle);
- HookHandle:=SetWindowsHookEx(WH_CBT, @CBTHook, HLibrary, TId);
- end;
- end;
-
-
-
-
- procedure DelCreateWindowHook; stdcall; export;
- begin
- if HookHandle <> 0 then
- begin
- UnhookWindowsHookEx(HookHandle);
- HookHandle:=0;
- end;
- end;
Примечание #1 (3 ноября 2011, 18:03): Хук разумеется не системный.
Собственно не понятно следующее:
Почему происходит эта ошибка. Я ведь не трогаю в своей DLL окна с классом #32770.
Как локализовать проблему, с чего нужно начинать.
Спасибо всем кто отзовётся.
 |
Вопрос задал: QWERYTY (статус: Посетитель)
Вопрос отправлен: 3 ноября 2011, 17:52
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 5 ноября 2011, 10:53; участников в обсуждении: 2.
|
bugmenot (статус: 3-ий класс), 4 ноября 2011, 16:34 [#1]:
Хрустальный шар говорит мне, что мистическая ошибка - access violation. И еще, #32770 похоже на атом, а не на строку.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
QWERYTY (статус: Посетитель), 4 ноября 2011, 21:28 [#2]:
Не знаю атом там или молекула или ядро, но WNDINFO указывает именно такой класс.
По части access violation, как распознать и вылечить?
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 5 ноября 2011, 00:34 [#3]:
#32770 The class for a dialog box.
Это из MSDN.
Так же узнал что # в делфи сообщает что оставшуюся часть строки нужно преобразовать в атом. Вот функции и находят когда указываешь в качестве класса #32770 атом 0x8002.
При чём тут всё это?
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 5 ноября 2011, 00:53 [#4]:
Инфа об окне, приводящем к ошибке:
1. Окно не блокирует окно его породившее. Т.е. не происходит так как например при сохранении файлов, когда становится невозможным передвинуть главное окно программы.
2. Окно порождает ещё 8 хендлов разного класса: три кнопки, один эдит и 4 аналога Label в делфи.
3. Окно не имеет заголовка.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 5 ноября 2011, 01:08 [#5]:
Проклятье какое-то.
Это первое что я закодил без вяких манёвров, обходных путей.
И задача была бы решена на прямую, в лоб, если бы не этот БАГ.
Хотел снимать перед открытием этого окна хук, а по закрытии ставить обратно, но при этом почемуто обнуляются переменные в DLL(код где я их сам обнуляю был закоментен), хотя грузится она не динамически.
Ну и разумеется не имею событий по которым я бы мог снимать и ставить хук.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 5 ноября 2011, 10:34 [#6]:
Проблема с этим грёбаным атомом.
Если главное окно программы пытается создать окно с классом #32770, то так же всё подвисает, идёт активная работа с жёстким диском после чего появляется окно что программа будет закрыта.
Я пробовал написать код для окон с классом #32770 в своей DLL, но эффекта 0. Как только пытаешся вызвать окно, немедленно происходит зависон.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 5 ноября 2011, 10:53 [#7]:
А вот эта информация о чём говорит?
Exception information
Code: 0xc0000005 Flags: 0x00000000
Record: 0x0000000000000000 Address: 0x0000000005b63b7f
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|