если создать глобальный %subj% из к-л нитки, а затем выйти из нее, то кто-то нахально вызывает UnhookWindowsHookEx.
Соответственно, DLL-ка отовсюду выглужается. Это что, так задумано? Или у меня глюки?
Здравствуйте Блудов Павел Васильевич, вы писали:
БПВ>если создать глобальный %subj% из к-л нитки, а затем выйти из нее, то кто-то нахально вызывает UnhookWindowsHookEx. БПВ>Соответственно, DLL-ка отовсюду выглужается. Это что, так задумано? Или у меня глюки?
Не знаю, как это было задумано, но работает именно так. Объекты hook имеют явный thread affinity,
например, UnhookWindowsHookEx из другого потока не работает. Внятно это, к сожалению, нигде не написано, так что базируюсь на личном опыте.
В МСДН и в хелпе по Win32 API точно говорится что при выходе из цепочки поставившей ловушку система сама ловушку снимает. Но не снимая ловушки можно выхватить глюк.
У Рихтера по этому поводу в примере сделано так: ставит ловушку, зацикливает цепочку на выбор месседжей, при определенном месседже цикл завершается и ловушка снимается.
kanych
БПВ>Никто не сталкивался с такой проблемой:
БПВ>если создать глобальный %subj% из к-л нитки, а затем выйти из нее, то кто-то нахально вызывает UnhookWindowsHookEx. БПВ>Соответственно, DLL-ка отовсюду выглужается. Это что, так задумано? Или у меня глюки?
БПВ>Надеюсь на помошь, БПВ>Павел.
Здравствуйте kanych, вы писали:
K>В МСДН и в хелпе по Win32 API точно говорится что при выходе из цепочки поставившей ловушку система сама ловушку снимает. Но не снимая ловушки можно выхватить глюк.
K>У Рихтера по этому поводу в примере сделано так: ставит ловушку, зацикливает цепочку на выбор месседжей, при определенном месседже цикл завершается и ловушка снимается.
K>kanych
Так и сделали. Вместо ::SetwindowsHookEx() вызывается ::CreateThread(), а ::SetwindowsHookEx() вызывается от-туда.
Соответственно, вместо ::UnHookWindowsHookEx() имеем ::PostThreadMessage() + ::WaitForSingleObject().