Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];




Вниз

Кто-нибудь писал ловушки (hooks)? Подскажите ... 


star   (2002-01-28 12:23) [0]

Написал я глобальную ловушку на перехват всех сообщений Windows (на вызов процедуры окна). Сделал dll-ку, сделал при ее инициализации файл отображаемый в память, поместил там переменную, в которую при инициализации ловушки помещается HHOOK, который возвращается SetWindowsHookEx (на сколько я понял это указатель на следующую ловушку в очереди)...
Вроде все работает, но начались странности: когда работает моя ловушка, некоторые программы отказываются запускаться, пишут о недопустимой ошибке в модуле USER.EXE. Я пересмотрел всю свою длл-ку, вроде нигде ничего могущего создавать ошибки не нашел.
Может кто сталкивался, подскажите, как устранить...



Delphimun   (2002-01-28 14:28) [1]

Dll свою покажи



star   (2002-01-28 15:36) [2]

Показываю:

library myDll;

uses
windows,
CommCtrl,
Messages;

const
cMMFileName: PChar = "SharedMapData";

type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = record
FormWnd:HWND;
MyHook:HHook;
end;

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

{
WindowDebugger
------------
Процедура перехватывает сообщения передаваемые системой процедурам окна.
}

function WindowDebugger (code: integer; wParam: longint; lParam: longint): longword; stdcall;
var
Struct:^CWPSTRUCT;
msg:cardinal;
p:PChar;
Item:^TLVItem;
cdt:TCopyDataStruct;
begin
if code<0 then begin
if (GlobalData<>nil) and (GlobalData^.MyHook<>0) then
WindowDebugger:=CallNextHookEx(GlobalData^.MyHook,code,wParam,lparam)
else WindowDebugger:=0;
Exit;
end;

// lParam содержит указатель на структуру, содержащую информацию о сообщении
Struct:=pointer(lParam);
if Struct<>nil then msg:=Struct^.message
else msg:=0;

// При возникновении следующих событий уведомляется главное приложение
case msg of
WM_CREATE:
if Wnd<>0 then SendMessage (Wnd,WM_USER,Struct^.message,Struct^.hwnd);

WM_DESTROY:
if Wnd<>0 then SendMessage (Wnd,WM_USER,Struct^.message,Struct^.hwnd);

LVM_INSERTITEM:
begin
Item:=Pointer(Struct^.lparam);
if Item<>nil then
begin
if Item^.pszText<>LPSTR_TEXTCALLBACK then
begin
p:=Item^.pszText;
Cdt.dwData:=LVM_INSERTITEM;
Cdt.cbData:=Item^.cchTextMax;
Cdt.lpData:=p;
if Wnd<>0 then SendMessage (Wnd,WM_COPYDATA,Struct^.hwnd,integer(@cdt));
end
else begin
Cdt.dwData:=0;
Cdt.cbData:=0;
Cdt.lpData:=nil;
end;
end;
if Wnd<>0 then SendMessage (Wnd,WM_USER,Struct^.message,Struct^.hwnd);
end;

WindowDebugger:=0;

if (GlobalData<>nil) and (GlobalData^.MyHook<>0) then
WindowDebugger:=CallNextHookEx(GlobalData^.MyHook,code,wParam,lparam);
exit;
end;

{
SetHookHandle
-------------
Энта процедура вызывается из головного приложения дабы сообщить нашей ловушке
дескриптор следующей ловушки в очереди
}

procedure SetHandle(HookHandle: HHook;Wnd:HWND); stdcall;
begin
if GlobalData <> nil then GlobalData^.MyHook:=HookHandle;
end;

procedure OpenSharedData;
var
Size:Integer;
begin
Size:=SizeOf (TGlobalDLLData);
MapHandle:= CreateFileMapping (DWord(-1),nil,PAGE_READWRITE,0,
Size,cMMFileName);

if MapHandle<>0 then
begin
GlobalData:=MapViewOfFile (MapHandle,FILE_MAP_ALL_ACCESS,0,0,Size);

if GlobalData=nil then
begin
CloseHandle (MapHandle);
end;
end;

// Найдем наше приложение чтобы передавать ему сообщения
Wnd:=FindWindow ("TForm1","Form1");
end;

procedure CloseSharedData;
begin
if GlobalData<>nil then
begin
UnmapViewOfFile (GlobalData);
CloseHandle (MapHandle);
end;
end;

procedure DLLEntryPoint (dwReason:DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenSharedData;
DLL_PROCESS_DETACH: CloseSharedData;
end;
end;

exports WindowDebugger,SetHandle;

begin
Wnd:=0;
DllProc:=@DLLEntryPoint;
DLLEntryPoint (DLL_PROCESS_ATTACH);
end.

Ловушка перехватывает некоторые сообщения и информирует о них главное приложение ...



star   (2002-01-29 10:55) [3]

А! Нашел ошибку! В сообщении LVM_INSERTITEM, в структуре, описывающей новый элемент ListView, в качестве размера текстовой строки иногда передается астрономическая цифра ...
Т.Е. Item^.pszText="ПРИМЕР" - 6 символов, а в Item^.cchTextMax содержится иногда что-то вроде 897645902. Вот из-за этого и возникали корявки ...




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.021 c
1-90847           Olivka                2002-03-16 19:01  2002.03.28  
IDE


1-90947           voland0               2002-03-14 16:21  2002.03.28  
Рег. N и ключ для Delphi 5 Enterp Update Pack 1


1-90900           skovorodka            2002-03-17 11:03  2002.03.28  
Как зная путь к .exe файлу узнать его картинку ?


6-91028           SemFLY                2002-01-10 04:08  2002.03.28  
Компоненты Indy -> TIdTCPServer и TIdTCPClient


4-91117           star                  2002-01-28 12:23  2002.03.28  
Кто-нибудь писал ловушки (hooks)? Подскажите ...