我有一个 NPAPI 插件,它利用SetWindowsHookEx
引擎盖进行一些屏幕抓取。这个插件似乎在我测试过的大多数机器上都能成功运行。但是,在一台机器(32 位 Windows 7)上,当我在 Chrome(26.0.1410.43m)下运行插件时,调用会SetWindowsHookEx
崩溃托管插件的进程。这不是SetWindowsHookEx
返回错误 - 它只是使进程崩溃。再说一次,这只发生在一台机器上:它在我们测试过的所有其他机器上都能正常工作。
但奇怪的是。您可能知道,Chrome 有多种定位插件的方法。通常,我们的 setup.exe 创建一些指向插件的注册表项,如下所示(来自 NSIS 安装程序):
WriteRegStr HKLM "Software\MozillaPlugins\@alanta.com/WinVncCtl\" "Path" "$INSTDIR\npWinVnc.dll"
WriteRegStr HKLM "Software\MozillaPlugins\@alanta.com/WinVncCtl\" "ProductName" "Alanta Remote Desktop Server"
WriteRegStr HKLM "Software\MozillaPlugins\@alanta.com/WinVncCtl\MimeTypes\application/x-alanta-vnc" "Description" "Alanta's VNC Server NPAPI Plugin"
SetWindowsHookEx
当 Chrome 从该位置加载插件时,它会在调用时崩溃。
但是,如果我卸载插件,然后将完全相同的 DLL 复制到%ProgramFiles%\Mozilla Firefox\Plugins\
,那么 Chrome 加载并运行插件就好了,调用SetWindowsHookEx()
成功。
对于它的价值,这是实际的(相当沼泽标准)调用:
// Add the CallWnd hook
hCallWndHook = SetWindowsHookEx(
WH_CALLWNDPROC, // Hook in before msg reaches app
(HOOKPROC) CallWndProc, // Hook procedure
hInstance, // This DLL instance
0L // Hook in to all apps
// GetCurrentThreadId() // DEBUG : HOOK ONLY WinVNC
);
调试器表明所有参数都指向合法、有效的东西。
有什么解决这个问题的建议吗?SetWindowsHookEx
任何人都知道在这种情况下可能会出现任何奇怪之处吗?
编辑:CallWndProc
看起来像这样:
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// Do we have to handle this message?
if (nCode == HC_ACTION)
{
// Process the hook if the WinVNC thread ID is valid
if (vnc_thread_id)
{
CWPSTRUCT *cwpStruct = (CWPSTRUCT *) lParam;
HookHandle(cwpStruct->message, cwpStruct->hwnd, cwpStruct->wParam, cwpStruct->lParam);
}
}
// Call the next handler in the chain
return CallNextHookEx (hCallWndHook, nCode, wParam, lParam);
}
中的断点CallWndProc
似乎没有被击中,所以我怀疑崩溃是在设置钩子期间发生的,而不是在以后的处理期间发生的。