Re: Hook на WndProc
От: a-lex Россия  
Дата: 05.12.03 08:34
Оценка:
Здравствуйте, pk_sly, Вы писали:
[]
_>Проблема ещё в том, что во всех БЕЗ ИСКЛЮЧЕНИЯ примерах, которые я нашёл, threadId указывается 0. Мне этого не надо — хук должен быть привязан к thread'у и, судя по документации, для WH_CALLWNDPROC это сделать можно.

Тогда указывайте NULL вместо hDLL.

hMod
Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process



_>Далее. Во всех БЕЗ ИСКЛЮЧЕНИЯ примерах GetProcAddress искал функцию по имени "func". Но позвольте, это же не переменная! Если функция — cdecl, то её имя в DLL будет "_func", если функция — stdcall (это — как раз, наш случай), то "_func@12". Либо я чего-то не понимаю, либо все до одного примеры — нерабочие.


С помощью .def-файла можно заставить функцию экспортироваться под любым нужным Вам именем. В MSDN это описывается в отдельной статье, а в примерах просто эти детали опущены.

_>Далее. Параметр pFn довольно загадочно описан в MSDN:

[]
_>Когда это — указатель на функцию в текущем процессе, вопросов нет.
_>Но что означает "указывать на процедуру перехвата в DLL"???
_>Это что, смещение относительно начала файла? RVA?
_>Или, учитывая, что экземпляр этой DLL загружен в память, это должен быть указатель на область памяти, в которую загружена DLL?

Нет. Просто в этом случае процедура обязана располагаться в DLL. Если же Вы ставите хук только для собственного процесса, Вам DLL не нужна (в качестве хук-процедуры можно использовать обычную функцию).

_>Как тогда понимать, что в противоположном случае, указатель должен указывать на область памяти текущего процесса? Что, загруженная и проинициализированная DLL — не в области памяти процесса?


Конечно, в области. Имеется в виду, что подходит любой код текущего процесса, а не только располагающийся в DLL.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.