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

Вниз

начал хуки познавать, нужна помощь   Найти похожие ветки 

 
Новенький в Делфи   (2002-06-20 02:20) [0]

Вот мой первый код (вообще первый) с использованием dll и хуков, так что особо не ругайтесь :)

Смысл в том что програма ловит нажатия клавишь и пишет их в memo.
Наставил функций ShowMessage() для проверки откуда именно меня программа выбрасывает.


//активация хука
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage("START HOOKING");
@hook:=nil;
hDLL:=LoadLibrary(PChar("MyHook.dll"));
if hDLL=0 then
begin
ShowMessage("CAN""T FIND DLL");
exit;
end;

@Hook:= GetProcAddress(hDLL,"hook");
ShowMessage("1"); // после этого сообщения программа начинает ругаться (Access Vialation 00000000xxxx) и выкидывает меня
Hook(true,Form1.Handle);
ShowMessage("OK");
end;

//перехватывает сообщения от dll и заносит в memo нажатую клавишу
procedure TForm1.WndProc(var msg: TMessage);
begin
inherited;
if msg.Msg = WM_KEYHOOK then // но если запустить программу из Дельфи, то именно в этом месте обрывается программа
begin
ShowMessage("COME MESSAGE");
try
Keys:= String(chr(msg.WParam));
memo1.Lines.Add(Keys);
Keys:="";
except end;
end;
end;

initialization
//тут регистрирую WM_KEYHOOK
end.

Library MyHook;

...
type
PGLOBAL= ^TGlobal;
TGlobal = packed record
SysHook:HWND;
MYWin:HWND;
end;

var
WM_KEYHOOK: Cardinal;
Global: PGlobal;
...
Function KeybProc(code: integer; wParam: word; lParam: longInt):longInt; stdcall;
var AppWin: HWND;
begin
if code<0 then
begin
Result:=CallNextHookEx(Global^.SysHook,code,wParam,lParam);
exit;
end;
if (lParam and KF_UP)=0 then
begin
AppWin:=0;
SendMessage(Global^.MyWin, WM_KEYHOOK, wParam,AppWin);
end;
Result:=CallNextHookEx(Global^.SysHook,code,wParam,lParam);
end;

procedure Hook(Switch: boolean; hMainProg:HWND) export;stdcall;
begin
if switch= true then
begin
MessageBox(0,"try set hook","mesage from dll",0);//До этого момента программа не доходит
Global^.SysHook:=SetWindowsHookEx(WH_KEYBOARD,@KeybProc,HInstance,0);
Global^.MyWin:=hMainProg;
end else
begin
UnHookWindowsHookEx(Global^.SysHook);
end;
end;



exports hook;

begin
WM_KEYHOOK:= RegisterWindowMessage("WM_KEYHOOK");
end.



Буду очень благодарен если поможете.
P.S. и ещё один вопрос возник, что означает символ "^", часть кода была содрана из одного примера, так что переписал его в слепую оттуда.


 
Новенький в Делфи   (2002-06-20 02:24) [1]

(дополнение)
глобальная переменная для unit1
Hook: procedure (switch: Boolean; hMainProg:HWND); stdcall;


 
Вячеслав ©   (2002-06-20 02:29) [2]

The symbol ^ has two purposes, . When it appears before a type identifier—

^typeName

—it denotes a type that represents pointers to variables of type typeName. When it appears after a pointer variable—

pointer^

—it dereferences the pointer; that is, it returns the value stored at the memory address held by the pointer.


 
Новенький в Делфи   (2002-06-20 12:06) [3]

Ну не ужели ни кто не поможет? :(


 
Юрий Зотов ©   (2002-06-21 03:22) [4]

Вы ставите ГЛОБАЛЬНЫЙ хук, который будет внедрен системой в КАЖДЫЙ процесс. Соответственно, переменная Global и все поля структуры, которую она адресует будут СВОИМИ в адресном пространстве КАЖДОГО процесса (а вовсе никакими не глобальными, как их ни называй, хоть SuperPuperSystemGlobal). Но правильные значения они получат только для ОДНОГО процесса - Вашего (ведь только он один вызвал функцию Hook, другие процессы этого не делали, они о Вашей DLL вообще ничего не знают). Чтобы сделать переменную действительно глобальной, нужно использовать другие механизмы - например, File Mapping.

Это принципиальная ошибка, все остальное уже мелочи. Как ее избежать - см. статью Алексея Павлова на "Королевстве" - там все подробно расписано.


 
Юрий Зотов ©   (2002-06-21 04:10) [5]

И все-таки, надо сказать и о других ошибках.

Переменная Global - указатель, но что он адресует? Ничего. Под структуру, которую он должен адресовать, не выделена память, а его значение Вами не проинициализировано. Компилятор же инициализирует его nil"ом - поэтому, когда Вы вызываете Hook, а та обращается к Global^.SysHook и вылетает Access Vialation.



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

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

Наверх




Память: 0.48 MB
Время: 0.01 c
8-71271
BJValentine
2002-02-09 20:43
2002.08.22
Эквалайзер


1-71261
big_bugzy
2002-08-12 10:54
2002.08.22
Помогите разобраться с координитами


6-71285
GM_
2002-06-10 09:41
2002.08.22
IP адрес отправки UDP пакета


1-71113
poligalov1
2002-08-12 08:17
2002.08.22
вопрос


3-70960
etho
2002-08-02 14:51
2002.08.22
Как создать многотабличный отчет в DELPHI?