Здравствуйте, уважаемые коллеги.
Нижеприведенный код я использую для "отлова" запуска определенного приложения. Раньше (код скомпиленный на 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.