Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ошибка при выполнении Hook


Автор: FShadow 6.4.2008, 17:20
Помогите разобраться с ошибкой при выполнении кода.

Значит суть ошибки следующая. Когда создаю дочернюю форму все проходит нормально.
При закрытии дочернего окна появляется ошибка:
First chance exception at $765D3843. Exception class EAccessViolation with message 'Access violation at address 76AAEE25 in module 'USER32.dll'. Read of address 00000000'. Process TestStend.exe (1528)

В чем ошибка? Помогите пожалуйста!!

Код

{**********Модуль хука*******************}
unit uHook;

interface

uses
  SysUtils, Classes, Windows, Messages, uTestForm;

function SetHook: boolean;
function StopHook: boolean;
function HookProc(Code:Integer; WParam:LongInt; Msg: PCWPStruct):LongInt;

var
  MyHook: HHook = 0;

implementation



function HookProc(Code:Integer; WParam:LongInt; Msg: PCWPStruct):LongInt;
begin
  if Code < 0 then
  begin
    Result := CallNextHookEx(MyHook, Code, WParam, Longint(Msg));
    Exit;
  end;
  if Code = HC_ACTION  then
   case Msg.message of
     // WM_MDICREATE создание дочернего MDI-окна
     WM_MDICREATE: Form1.ListBox1.Items.Add('Создание MDIChild');
    // WM_MDIDESTROY удаление дочернего MDI-окна
     WM_MDIDESTROY: Form1.ListBox1.Items.Add('Удаление MDIChild');
   end;
  CallNextHookEx(MyHook, Code, WParam, Longint(Msg));
  HookProc := 0;
  Exit;
end;


function SetHook: boolean;
begin
  MyHook:=SetWindowsHookEx(WH_CALLWNDPROC, @HookProc, 0, GetCurrentThreadID());
  if MyHook <> 0 then Result := True
    else Result := False;
end;

function StopHook: boolean;
begin
  if MyHook <> 0 then
  begin
    StopHook := UnhookWindowsHookEx(MyHook);
    MyHook:=0;
  end;
end;

end.


{**********Модуль Главной формы***************}
unit uTestForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uComp, CalcEdit, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    ...
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses uHook, uMDIChild;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  TForm2.Create(Application).Show;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  StopHook;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ...
  SetHook;
end;

end.

Автор: FShadow 6.4.2008, 18:14
Извиняюсь решение нашел сам.
Надо было вместо
Код

function HookProc(Code:Integer; WParam:LongInt; Msg: PCWPStruct):LongInt;

объявить так
Код

function HookProc(Code:Integer; WParam:LongInt; Msg: PCWPStruct):LongInt; stdcall;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)