Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 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. Вот из-за этого и возникали корявки ...



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

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

Наверх





Память: 0.46 MB
Время: 0.009 c
14-91042
Фэ
2002-02-13 17:46
2002.03.28
Почему исчезают ветки ?


3-90770
Snake
2002-03-02 09:17
2002.03.28
В BDE администраторе на что влияет свойство LOCAL SHARE?


14-91047
макар
2002-02-13 17:38
2002.03.28
Может кто-нибудь знает


1-91004
fag2000@ok.ru
2002-03-15 17:43
2002.03.28
Как глобально выделить память?


1-90821
Alev
2002-03-08 14:52
2002.03.28
Как можно создать папку?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский