Форум: "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