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

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

Как получить название функции, зная хендл, полученный от нее?


v0id ©   (2002-06-23 08:57:00) 

Прошу мастеров дельфей (если вы действительно мастера дельфи) ответить на следующий вопрос: Как получить название функции, зная хендл, полученный от нее? То есть я вызвал функцию, допустим SetWindowsHookEx, получил от нее хендл. Теперь могу ли я, зная этот хендл, наоборот получить название функции?? Большое спасибо всем, кто поможет.


v0id   (2002-06-24 11:55:00) [1]

Конечно, одну и туже задачу можно решить многими путями. И, кажется, я ее решил. Хоть и не так, как думал, но тем не менее... Всем большое спасибо.


Игорь Шевченко   (2002-06-24 10:08:00) [2]

v0id © (24.06.02 10:05)


>Собираюсь программу написать.


Это постановка задачи ? :-)

Я почему спрашиваю про постановку, потому что чаще всего задача решается не единственным путем :-)


v0id   (2002-06-24 10:05:00) [3]

Если возможно, то как?
Собираюсь программу написать.


Игорь Шевченко   (2002-06-24 09:46:00) [4]

v0id © (24.06.02 08:13)

Определить возможно. Но надо ли ?
Не могли бы вы, уважаемый, поподробнее описать постановку задачи, в которой возник этот вопрос?


v0id   (2002-06-24 08:13:00) [5]

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

А с какими параметрами? CallNextHookEx(SysHook, 0, 0, 0) (если из своей программы, опять же зная хендл SysHook"а)??

И еще... Возможно ли определить тип Hook"а (WH_GETMESSAGE, WH_KEYBOARD и т.д.)? Хотя в справке написано, что CallNextHookEx возвращает значение в зависимости от типа хука...
("The meaning of the return value depends on the hook type").

crazy progman -> если бы это было никому не нужным, никто бы и не спрашивал тогда.


v0id   (2002-06-24 07:48:00) [6]

Нет, нет. Именно название.


crazy progman   (2002-06-23 22:59:00) [7]

А зачем это вообще тебе нужно?


Юрий Зотов   (2002-06-23 22:02:00) [8]

Так Вам нужен ТИП хэндла, а не имя функции, которая его дала. Надо же нормально формулировать вопросы.

Для некоторых хэндлов это проверяется - IsWindow, IsMenu. Но зачем? Вы и так всегда знаете смысл каждого хэндла в своей программе - Вы же сами их и получаете.

Что касается ловушек, то вызов CallNextHookEx даст ноль, если ловушка отсутствует.


v0id   (2002-06-23 21:14:00) [9]

Да, я согласен, что один и тот же хендл может быть получен совершенно разными функциями. Но смотрите:


var SysHook : THandle;

//...

SysHook:= SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, HInstance, 0);
//Я получил хендл от SetWindowsHookEx.

//...

SetWindowText( SysHook, "Text");


Но таким способом ничего не получится, т.к. SysHook - не хендл окна... Т.е. можно ли через какую-нибудь "проверку" определить?
(к сожалению, функции IsHook нету).

P.S.: Если нельзя определить хендлы, то тогда можно определить установлены ли хуки в системе (это уже, правда, другой вопрос)?


Юрий Зотов   (2002-06-23 20:44:00) [10]

Хранит, конечно. Глобальные - в системных таблицах. Процессозависимые - в таблицах процессов. И т.д. Ну и что с того?

ОК, имею я хэндл. Вызвал IsWindow и выяснил, что это хэндл окна. Что дальше? Ничего. Этот хэндл мог быть получен вызовом ЛЮБОЙ из, наверное, пары десятков функций (см. Window Functions). Какой именно - неизвестно и установить НЕВОЗМОЖНО.

То же самое с хэндлами процессов и потоков (см. Process and Thread Functions). Шрифтов (Font and Text Functions), кистей (Brush Functions) и перьев (Pen Functions). Файлов (File Functions). И т.д. Здесь я перечислил только малую часть разных видов хэндлов, но посмотрите хотя бы даже эти разделы - и Вы увидите, что один и тот же хэндл мог быть получен от совершенно разных функций.

Хуже того, хэндл не обязан быть глобальным. Он может быть процессозависимым - то есть, иметь один смысл в контексте одного процесса и совершенно иной в контексте другого процесса (или вовсе не иметь в нем никакого смысла). Существует и такая штука, как псевдохэндлы и DuplicateHandle.

Так что, в отличие от хэндлов, вопрос Ваш смысла, извините, не имеет. По крайней мере, в той формулировке, в которой он прозвучал. Чистая клюква, не более - о чем и было сказано.


v0id   (2002-06-23 18:06:00) [11]

Юрий Зотов -> Мне кажется, что это совсем разные вещи. Математика - одно, а тут немного другое. Вот если Windows генерирует хендл случайным образом, то найти название функции было бы очень проблематично (если невозможно).

Polevi -> Тогда хотелось бы узнать где Windows хранит информацию о хендлах...


Polevi   (2002-06-23 17:41:00) [12]

да достойный вопрос
хотя Windows хранит гдето у себя информацию о хендлах..


Юрий Зотов   (2002-06-23 11:31:00) [13]

Классный вопрос. На "Королевстве" тут же попал бы в раздел "клюква".

Вне сомнений, сэр! Как только Вы скажете мне, что это хэндл хука, а не чего-либо еще, так я тут Вам отвечу, что он был получен вызовом SetWindowsHookEx. И при этом даже не стану писать ни единой строчки кода. Потому что по-другому его получить просто нельзя, даже если Вы вызовете SetWindowsHook (без Ex). Правда, с другими функциями будет гораздо сложнее.

Если же серьезно, то Ваш вопрос аналогичен следующему.

"Известно, что 3+5 будет 8. Ставим обратную задачу - есть число 8 и известно, что оно было получено в результате сложения. Как узнать все слагаемые?".

А любой хэндл - это тоже просто число. Всего навсего. Так вот - я даю Вам число, а Вы скажите мне, как я его получил. Годится?

Вот число: 1234567. Жду ответа.


Наверх

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