SetWindowsHookEx
ボンネットの下でスクリーンスクレイピングを行うNPAPIプラグインがあります。このプラグインは、私がテストしたほとんどのマシンで正常に動作するようです。ただし、1 台のマシン (32 ビット Windows 7) で Chrome (26.0.1410.43m) でプラグインを実行SetWindowsHookEx
すると、プラグインがホストされているプロセスがクラッシュします。エラーを返すのではなくSetWindowsHookEx
、プロセスをクラッシュさせるだけです。繰り返しますが、これは 1 台のマシンでのみ発生します。テストした他のすべてのマシンで問題なく動作します。
しかし、ここに奇妙なことがあります。ご存知かもしれませんが、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"
Chrome がその場所からプラグインをロードすると、SetWindowsHookEx
呼び出し時にクラッシュします。
ただし、プラグインをアンインストールしてからまったく同じ 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
ヒットしないようです。そのため、フックの後の処理中ではなく、フックの設定中にクラッシュが発生していると思われます。