WH_SHELL Hook
От: Restlin  
Дата: 11.07.04 20:00
Оценка:
Здравствуйте, уважаемые коллеги.
Нижеприведенный код я использую для "отлова" запуска определенного приложения. Раньше (код скомпиленный на Delphi 5) все работало. Теперь компилю на Delphi 7 и при запуске любого приложения получаю "Access Violation Error. Память по адресу НЕКИЙ_АДРЕС (например 00ffea5648) обратилась по адресу ТОТ_ЖЕ_АДРЕС (00ffea5648). Память не может быть read. Может кто-нибудь растолкует мне в чем дело?
Спасибо.

Код следующий (извините что много):


library mydll;


uses
  SysUtils, Windows, Messages, Classes, Forms;

{$R *.RES}
const
  WM_HOOK   = WM_USER+123;
  MMFName   : PChar = 'MyMMF';

type
  PGlobalDLLData = ^TGlobalDLLData;
  TGlobalDLLData = packed record
    SysHook: HWND;
  end;

var
  GlobalData  : PGlobalDLLData;
  MMFHandle   : THandle;
  Wnd : HWND;

function  GetShellHook(HookCode,WndHandle,IsWndFullScrn : integer) : integer; stdcall;
begin
  if HookCode=HSHELL_WINDOWCREATED then begin
    Wnd:=FindWindow(nil,'frmMain');
    PostMessage(Wnd,WM_HOOK,WndHandle,IsWndFullScrn);
  end;
  Result := CallNextHookEx(GlobalData^.SysHook, HookCode, WndHandle, IsWndFullScrn);
end;

function SetHook: boolean; stdcall;
begin
  GlobalData^.SysHook := SetWindowsHookEx(WH_SHELL, @GetShellHook,HInstance, 0);
  Result := (GlobalData^.SysHook<>0);
end;

function RemoveHook: boolean; stdcall;
begin
  Result := UnhookWindowsHookEx(GlobalData^.SysHook);
end;


procedure OpenGlobalData();
begin
  MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
  if MMFHandle = 0 then
    MessageBox(0, 'Can''t create FileMapping', 'Message from Exampel2/Process1', 0);
  GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
  if GlobalData = nil then
    begin
      CloseHandle(MMFHandle);
      MessageBox(0, 'Can''t make MapViewOfFile', 'Message from Exampel2/Process1', 0);
    end;
end;

procedure CloseGlobalData();
begin
  UnmapViewOfFile(GlobalData);
  CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
  case dwReason of
    DLL_PROCESS_ATTACH: OpenGlobalData;
    DLL_PROCESS_DETACH: CloseGlobalData;
  end;
end;

exports
  SetHook,
  RemoveHook;

begin
  DLLProc:= @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.