我正在研究重新制作旧的CBT Windows挂钩,并且对当前的工作方式有些困惑。它的设置方式是一个dll处理Windows挂钩及其逻辑,而另一个程序应在设置挂钩时调用该dll。看起来像这样:
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
// this is the function the other program calls into
void InstallHook()
{
// hdll is this dll's address
SetWindowsHookEx(WH_CBT, HookProc, hDLL, 0);
}
然后,我们有了DllMain函数。每当调用hookProc函数时,该dllmain函数似乎都会被调用,我不了解这种行为。我检查了fdwReason,由于dll进程附加事件而被调用。
每次调用HookProc时如何触发此事件?由于它是一个全局钩子,因此我认为Windows会加载dll并将其持久保存,并在需要时调用HookProc。但是据我所知,它的作用就像在调用HookProc时将其加载回去一样。这是通常的工作方式吗,还是代码库的另一部分引起了这种情况?
最佳答案
实现全局挂钩的DLL被加载到系统中触发挂钩的任何进程中。
(这就是为什么必须将全局挂钩实现为DLL的原因-以便可以将它们加载到其他进程中)。