Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.08.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.08.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.007 c
3-95679
Soft(Unpowered Kiborg)
2002-08-08 11:04
2002.08.29
UDF функции в SQL серверах


4-96036
Proton
2002-06-23 19:40
2002.08.29
пункт меню help был прижат к правому краю


1-95742
unfam
2002-08-19 03:11
2002.08.29
PChar


8-95913
Николай.
2002-04-21 17:28
2002.08.29
Проигрывание MP3 файлов


4-96021
Ally
2002-06-26 13:59
2002.08.29
WideChar в RichEdit





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