Форум: "WinAPI";
Текущий архив: 2002.08.22;
Скачать: [xml.tar.bz2];
Внизначал хуки познавать, нужна помощь Найти похожие ветки
← →
Новенький в Делфи (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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.08.22;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c