Как правильно снять хук WH_CALLWNDPROCRET
От: Aniskin  
Дата: 09.09.17 06:34
Оценка:
Вызываю SetWindowsHookEx(WH_CALLWNDPROCRET, MyHookProc, 0, ThreadID), где ThreadID — это НЕ текущий поток. Делаю свои дела, затем снимаю хук. Но после снятия хука происходят вызовы MyHookProc, а мои данные и сама MyHookProc уже не валидны, и приложение падает. Есть способы победить беду, или установка хука WH_CALLWNDPROCRET на иной поток кроме текущего противозаконны?
Re: Как правильно снять хук WH_CALLWNDPROCRET
От: SаNNy Россия  
Дата: 09.09.17 07:05
Оценка:
UnhookWindowsHookEx что возвращает?
Re[2]: Как правильно снять хук WH_CALLWNDPROCRET
От: Aniskin  
Дата: 09.09.17 08:14
Оценка:
Здравствуйте, SаNNy, Вы писали:

SNN>UnhookWindowsHookEx что возвращает?


Проблема проявляется очень редко. Но когда смог ее поймать, то UnhookWindowsHookEx вернула True.
Re: Как правильно снять хук WH_CALLWNDPROCRET
От: std.denis Россия  
Дата: 09.09.17 09:42
Оценка: 4 (1)
Здравствуйте, Aniskin, Вы писали:

A>Вызываю SetWindowsHookEx(WH_CALLWNDPROCRET, MyHookProc, 0, ThreadID), где ThreadID — это НЕ текущий поток. Делаю свои дела, затем снимаю хук. Но после снятия хука происходят вызовы MyHookProc, а мои данные и сама MyHookProc уже не валидны, и приложение падает. Есть способы победить беду, или установка хука WH_CALLWNDPROCRET на иной поток кроме текущего противозаконны?


Вы после снятия хука засылаете сообщение в очередь, чтобы корректно подождать снятия хука? Синхронно, навроде SendMessage(hWnd, WM_NULL, ...)
Ибо даже в доке написано:

The hook procedure can be in the state of being called by another thread even after UnhookWindowsHookEx returns.
If the hook procedure is not being called concurrently, the hook procedure is removed immediately before UnhookWindowsHookEx returns.

Re[2]: Как правильно снять хук WH_CALLWNDPROCRET
От: Aniskin  
Дата: 09.09.17 10:24
Оценка:
Здравствуйте, std.denis, Вы писали:

SD>даже в доке написано


Да, действительно, черным по белому. Проглядел, каюсь. Остался только вопрос будет ли достаточным SendMessage(hWnd, WM_NULL, ...) для решения проблемы? И как быть, если hWnd висит, а я не хочу висеть вместе с ним. Или если hWnd висит, то MyProc не будет вызвана гарантированно, и можно воспользоваться SendMessageTimeout?
Re: Как правильно снять хук WH_CALLWNDPROCRET
От: CEMb  
Дата: 09.09.17 12:32
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Вызываю SetWindowsHookEx(WH_CALLWNDPROCRET, MyHookProc, 0, ThreadID), где ThreadID — это НЕ текущий поток. Делаю свои дела, затем снимаю хук. Но после снятия хука происходят вызовы MyHookProc, а мои данные и сама MyHookProc уже не валидны, и приложение падает. Есть способы победить беду, или установка хука WH_CALLWNDPROCRET на иной поток кроме текущего противозаконны?


А если так:
— suspend thread
— unhook
— release thread
?

Может быть есть способы предотвратить сами отправления сообщений SendMessage/PostMessage?
Если так, то тогда лучше:
— остановить сообщения
— в хуке в цикле PeekMessage, Dispatch
— unhook
— отпустить сообщения
Re[3]: Как правильно снять хук WH_CALLWNDPROCRET
От: Alexander G Украина  
Дата: 09.09.17 13:25
Оценка:
Здравствуйте, Aniskin, Вы писали:

A>Да, действительно, черным по белому. Проглядел, каюсь. Остался только вопрос будет ли достаточным SendMessage(hWnd, WM_NULL, ...) для решения проблемы? И как быть, если hWnd висит, а я не хочу висеть вместе с ним. Или если hWnd висит, то MyProc не будет вызвана гарантированно, и можно воспользоваться SendMessageTimeout?


Если само удаление связанных структур может подождать, то может вместо Unhook делать PostMessage с запросом Unhook, как отвиснет, так и приедет
Русский военный корабль идёт ко дну!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.