Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SetWindowsHookEx(WH_KEYBOARD, 0)


KADAN ©   (2003-11-17 22:14:00) 

Доброго времени суток, мастера!
Возникла некоторая проблемка...не могу поставить хук на 0 (на WH_KEYBOARD).
Делаю так: есть DLL-ка, в ней ставится хук, процедура
обработки там же (с резултом CallNextHookEx). среди переменных DLL-ки только
HHOOK и процедурка приложения, в которую отдаются хукнутые данные.
Пока я в своем приложении хук работает, как только нажму эникей на
рабочем столе хук падает, только хендл остается :)
(Хотя в фаре хук работает, как ни странно).


Digitman   (2003-11-20 16:48:00) [1]


> 1) kto skazal pro kakoy to servicie??? v chem problema FileMapping
> dlya NT servica???


я сказал) ... ибо столкнулся с такой ситуацией "в лоб" ... разбираться, правду скажу, не стал - не было времени, решил проблему организации глоб.доступных данных иным образом, без использования MMF ... но суть там была такова : сервис грузил экз-р хук-DLL, в ходе иниц-ции экз-ра успешно вызывалась CreateFileMapping(PAGE_READWRITE), далее устанавливался сам хук, после чего хук-DLL в ходе автовнедрения системой очер.своего экз-ра пыталась проделать тоже самое CreateFileMapping(PAGE_READWRITE), и код иниц-ции экземпляра получал отлуп из-за невозможности получить доступ к MMF ИМЕННО с правами PAGE_READWRITE (успешен был запрос только на PAGE_READ)

и это - факт невозможности перенести код примера работы с MMF "один-в-один" в приложение-сервис, по кр.мере для Win2000


> kak ti sebe predstavlyash situaciyu kogda hook esche ne
> ustanovlen a uzhe vizivaetsya funkciya hooka gde u tebya
> CallNextHookEx... absurd :(


почему "абсурд" ?
смотри сюда)

Предположим, процесс, устанавливающий глоб.хук, имеет пониженный приоритет
Некий код.поток этого процесса вызвал ф-цию
GlobalData^.hHookHandle := SetWindowsHookEx(), (1)

в теле которой (!!) система УЖЕ начинает разворачивать послед-ть действий по внедрению и инициализации экз-ров хук-DLL в существующие GUI-процессы (это происходит в основных кодовых потоках уже тех процессов, в которые очер.экз-р внедряется, и целевые процессы могут иметь значительно более высоций приоритет, нежели процесс, устанавливающий хук).

В какой-то момент времени может случиться так, что очередной внедренный экз-р завершил инициализацию и тут же возможен вызов системой колбек-ф-ции, где тут же вызывается CallNextHookEx(GlobalData^.hHookHandle, ...)

Но !

см.(1) - значение хендла хука будет записано в область памяти GlobalData^.hHookHandle ПОСЛЕвсего этого ! Значит, те процессы, в которые уже внедрена хук-DLL (и иниц-я ее успешно завершилась) имеют все шансы на вызвов системой колбэк-ф-ции, и , соответственно, на обращение к GlobalData^.hHookHandle, значение которой ЕЩЕ НЕ УСТАНОВЛЕНО !


jonni   (2003-11-20 16:07:00) [2]

to Digitman ©

1) kto skazal pro kakoy to servicie??? v chem problema FileMapping dlya NT servica???

2) kak ti sebe predstavlyash situaciyu kogda hook esche ne ustanovlen a uzhe vizivaetsya funkciya hooka gde u tebya CallNextHookEx... absurd :(
vkonce koncov esli eto tak strashno to togda proveryai znachenie svoego HHOOK chtobi podstrahovat"sya... no niukogo takoy problemi nikogda ne voznikalo....
vsegda esli hook stavilsya to HHOOK bila pravil"naya i CallNextHook vsegda rabotal otlichno
nado esche ne zabivat" pri obrabotke v @hooking Code>=0


Digitman   (2003-11-20 11:37:00) [3]


> jonni


все это замечательно, но есть ряд оч важных моментов, не учитываемых и никак не комментируемых там.

1) этот код, будучи использованный не обычным приложением, а NT-сервисом, работать как положено не будет - возникнут серьезные проблемы с CreateFileMapping() с указанными в примере правами доступа к глоб.памяти

2) нет никакой гарантии, что SetWindowsHookEx() вернет хэндл хука в глоб.доступную переменную rHookRec^.HookID РАНЬШЕ чем он будет использован первым же вызовом ф-ции CallNextHookEx().. Результат такой ситуации - непредсказуемый. Следовательно, без глоб.объекта синхронизации доступа к переменной rHookRec^.HookID не обойтись, ибо MSDN никак не комментирует возможность или невозможность такой ситуации.


jonni   (2003-11-19 20:11:00) [4]

http://www.gajits.com/delphihooks.asp
tut vse est"


Digitman   (2003-11-19 11:03:00) [5]


> KADAN


мне хочется чтобы ты думал) ... понимаешь ? ду-мал ! сам думал ! а не чужой головой) ... толку от этого, поверь, как от козла молока

посему в [4] я задал тебе важный наводящий вопрос, который ты попросту проигнорировал ... проигнорировал ты, видимо, и рекомендацию сравнить пример в статье со своим кодом ... чего ж еще-то хочешь после этого ?


Игорь Шевченко   (2003-11-19 00:01:00) [6]

KADAN (18.11.03 23:09)

В статьях этот момент очень подробно описан, про то, как и где надо хранить общие для глобального хука переменные, а именно в проекции файла в память.

Два раза попробуй прочитать.


KADAN   (2003-11-18 23:09:00) [7]

>2 Digitman
у меня сложилось впечатление, что все твои ответы сводятся к "читай мануал"... читал, да... очень интересное чтиво... но не помогло :(


Digitman   (2003-11-18 11:22:00) [8]

а статьи соотв-щие почитать на этом сайте для начала ? лень ?


KADAN   (2003-11-18 11:16:00) [9]

ну тогда покажи как


Digitman   (2003-11-18 10:46:00) [10]


> var H:HHOOK


!!!!!!!!!!

вот как ты думаешь, СКОЛЬКО таких "переменных" существует в системе после установки глоб.хука ?


KADAN   (2003-11-18 10:41:00) [11]

Ну ладно, вот DLLина.

library Project2;

uses
windows, sysutils;

type TObrabotkaProc = procedure(wparam, lparam: Cardinal);

var H:HHOOK;
ObrProc:TObrabotkaProc;

function Hooking(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
begin
ObrProc(wparam,lparam);
result:=CallNextHookEx(H,code,wparam,lparam);
end;

function HOOKKB(Hmod:HINST;ThreadID:Cardinal; const Obrabotka:TObrabotkaProc):boolean;
begin
if H<>0 then messageboxex(0,"Already hooked!","Error",MB_ICONERROR or MB_OK or MB_APPLMODAL,0)
else begin
H:=SetWindowsHookEx(WH_KEYBOARD,@hooking,Hmod,ThreadID);
ObrProc:=Obrabotka;
if H=0 then messageboxex(0,"Can""t set hook!","Error",MB_ICONERROR or MB_OK or MB_APPLMODAL,0);
end;
result:=H<>0;
end;

function UNHOOKKB:boolean;
begin
result:=UnhookWindowsHookEx(H);
H := 0;
end;

exports HOOKKB, UNHOOKKB;

begin

end.


Digitman   (2003-11-18 08:31:00) [12]

первый параметр ф-ции CallNextHookEx() у тебя указывает в "никуда", вот и "падает" тот процесс, который вызвал эту ф-цию


Shluz   (2003-11-18 01:15:00) [13]

ошибка в процедуре ловушки, скорее всего использовал RTL функции и вроде того... лучше конечно код выложи


Наверх

Титульная страница Поиск, карта сайта Написать письмо