Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.28;
Скачать: CL | DM;

Вниз

Кто-нибудь писал ловушки (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. Вот из-за этого и возникали корявки ...



Страницы: 1 вся ветка

Текущий архив: 2002.03.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
1-90896
Tadeush
2002-03-18 10:39
2002.03.28
Hint


1-90959
Tolstomordik
2002-03-14 14:43
2002.03.28
Преобразование строки типа PChar в строку типа String


1-90819
Ryser
2002-03-14 13:43
2002.03.28
Замена символов в строке.


3-90727
JEff
2002-02-25 18:34
2002.03.28
КАК ЖЕ МНЕ ИЗМЕНИТЬ CAPTION QRLabel а?


3-90787
Вадим Андреевич
2002-03-04 08:36
2002.03.28
DBTable_lock record