DLL, введенная с помощью SetWindowsHookEx, неожиданно выгружается

Моя программа вызывает SetWindowsHookEx для внедрения моей DLL в один целевой процесс. Моя DLL содержит хук WH_GETMESSAGE и WH_CALLWNDPROC:

hGetMessageProcHook = SetWindowsHookEx(WH_GETMESSAGE,
        MyGetMsgProc,
        hMyDLLModule,
        dwTargetThreadId);

hCallWndProcHook = SetWindowsHookEx(WH_CALLWNDPROC,
        MyCallWndProc,
        hMyDLLModule,
        dwTargetThreadId);

Я никогда не звоню UnhookWindowsHookEx. Windows автоматически выгружает мою DLL после завершения моей программы (чисто или нет), когда целевое приложение в следующий раз отправляет сообщение Windows. Оба крючка работают хорошо.

Но на одной машине под управлением Windows Server 2016 Process Explorer показывает, что моя DLL иногда выгружается без предупреждения, конечно, мой хук больше не работает. Я никогда не видел этого раньше. Это какая-то защита в Windows Server?


person David Ching    schedule 18.08.2020    source источник
comment
Хуки влияют на общую производительность системы. Вот почему системе требуются крючки для взаимодействия, например. предписывая им своевременный выход на пенсию. Если процедура ловушки не может этого сделать, система делает то, что ей нужно для обеспечения стабильности системы. Я не знаю, является ли частью этого выгрузка модулей, хотя удаление хука, безусловно, является частью этого.   -  person IInspectable    schedule 18.08.2020
comment
@IInspectable, это не может быть правдой. Ничто не говорит о том, что крючок должен быть коротким.   -  person David Ching    schedule 18.08.2020
comment
Если этого не может быть, то, скорее всего, система лично вас просто ненавидит. Не знаю, как к этому подойти.   -  person IInspectable    schedule 18.08.2020
comment
@IInspectable После прочтения этого ответа я понимаю, что вы говорите. Я думал, вы говорите, что хук может быть установлен/установлен в систему только на короткое время, а не на то, что он должен выполняться в течение короткого времени.   -  person David Ching    schedule 18.08.2020