Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальные хуки, Теоретический аспект 
V
    Опции темы
AdverD
Дата 19.5.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 19.5.2009
Где: Москва

Репутация: нет
Всего: нет



Начитываю сейчас на тему обработки сообщений и хуков в МСДН и других источниках. Везде упоминается, что при создании глобального хука его код должен быть вынесен в длл, а причины как-то не указываются. Сегодня обнаружил, что глобальный хук возможен и без всякой динамической библиотеки, вот код:

Код

var

HookHandle: hHook;

 
function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg: PEVENTMSG;
begin

if Code >= 0 then begin
   result := 0;
   msg := Pointer(LParam);
   with Form1 do
     case msg.message of
       WM_MOUSEMOVE: Caption := IntToStr(msg.ParamL) + #32 + IntToStr(msg.ParamH);
       WM_LBUTTONDOWN: CheckBox1.Checked := true;
       WM_LBUTTONUP: CheckBox1.Checked := false;
       WM_RBUTTONDOWN: CheckBox2.Checked := true;
       WM_RBUTTONUP: CheckBox2.Checked := false;
       WM_KEYUP: CheckBox3.Checked := false;
       WM_KEYDOWN: CheckBox3.Checked := true;
     end;
end else
   result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.FormStyle := fsStayOnTop;
CheckBox1.Enabled := false;
CheckBox1.Caption := 'left button';
CheckBox2.Enabled := false;
CheckBox2.Caption := 'right button';
CheckBox3.Enabled := false;
CheckBox3.Caption := 'keyboard';
HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HookHandle <> 0 then
   UnhookWindowsHookEx(HookHandle);
end;


Отсюда вопрос, почему МСДН требует вынесения хука в библиотеку? Какой раздел почитать, чтобы понять, что это даёт и от чего защищает? Беглый просмотр функций, упоминающихся в материалах про хуки в МСДН только ещё больше запутал.


PM MAIL   Вверх
kami
Дата 19.5.2009, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Далеко не все глобальные хуки должны жить в dll.
К примеру, про WH_JOURNALRECORD MSDN пишет, что:

Цитата

A JournalRecordProc hook procedure does not need to live in a dynamic-link library. A JournalRecordProc hook procedure can live in the application itself. 




PM MAIL WWW   Вверх
bartram
Дата 19.5.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: 3
Всего: 29



WH_JOURNALRECORD и WH_JOURNALPLAYBACK - это всегда локальные системные хуки, котоpым не нужно быть в DLL. Также WH_SYSMSGFILTER - это всегда системный удаленный хук.


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
CodeMonkey
Дата 19.5.2009, 13:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 16
Всего: 89



В Dll код нужно выносить по той простой причине, что этот код должен быть внедрён в адресное пространство целевого процесса.

Например, другой процесс, не связанный с вами, ставит хук. Вот вы вызывали GetMessage. Должен сработать хук. Сейчас управление находится в вашем процессе. Как система вызовет обработчик хука, находящийся вообще в другом адресном пространстве? А никак.
Поэтому она требует, чтобы код был в DLL. Тогда она может спокойно загрузить DLL в ваш процесс, а когда вы вызываете GetMessage, то система просто проходит по списку хуков и вызывает код каждого обработчика, который сейчас сидит в вашем адресном пространстве. Очень просто.

Исключения бывают (тот же WH_JOURNALRECORD или _LL-хуки) - они не требуют DLL по той простой причине, что событие (грубо говоря) наступает не в самом процессе, а уровнем повыше, более глобально. Поэтому и нет смысла внедрять код в процесс - достаточно оповестить систему о подписке. Поэтому-то DLL и не нужна. Для остальных хуков - они работают "в контексте" процесса, поэтому хук требует DLL.

Возможно, вам будет интересна эта статья.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
AdverD
Дата 20.5.2009, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 19.5.2009
Где: Москва

Репутация: нет
Всего: нет



Большое спасибо, как раз то объяснение, что мне и требовалось.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.