Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-71078
Vitas2
2002-08-11 08:33
2002.08.22
TBitmap


3-70985
Mars
2002-07-31 11:08
2002.08.22
Инициализация BDE


1-71143
Лана Розанова
2002-08-13 08:21
2002.08.22
Клавиатура


1-71240
V.Turecky
2002-08-11 18:29
2002.08.22
Проверка существования строки в INI файле...


3-70951
falcon
2002-07-30 11:20
2002.08.22
ADO + SQL Server 2000, подстановочные поля





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский