Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.29;
Скачать: CL | DM;

Вниз

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

 
v0id ©   (2002-06-23 08:57) [0]

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


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

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

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

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

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

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

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


 
Polevi ©   (2002-06-23 17:41) [2]

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


 
v0id ©   (2002-06-23 18:06) [3]

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

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


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

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

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

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

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

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


 
v0id ©   (2002-06-23 21:14) [5]

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


var SysHook : THandle;

//...

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

//...

SetWindowText( SysHook, "Text");


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

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


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

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

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

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


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

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


 
v0id ©   (2002-06-24 07:48) [8]

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


 
v0id ©   (2002-06-24 08:13) [9]

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

А с какими параметрами? 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 -> если бы это было никому не нужным, никто бы и не спрашивал тогда.


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

v0id © (24.06.02 08:13)

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



 
v0id ©   (2002-06-24 10:05) [11]

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


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

v0id © (24.06.02 10:05)


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


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

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



 
v0id ©   (2002-06-24 11:55) [13]

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



Страницы: 1 вся ветка

Текущий архив: 2002.08.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
4-96016
anatoli
2002-06-24 09:37
2002.08.29
Как сделать задержку


7-95996
TOLTEC
2002-03-01 17:17
2002.08.29
TaskManeger


14-95949
IronHawk
2002-08-03 23:59
2002.08.29
Где » архивы старых форумов « ???


1-95842
Balu
2002-08-15 21:28
2002.08.29
MDI Form в DLL ошибка Can not assign TFont to TFont при OnHint


7-95984
CrazyAngel
2002-06-14 18:18
2002.08.29
ExitWindowsEx