| 
| 
 | Вопрос # 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
 ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |