0

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ヒットしないようです。そのため、フックの後の処理中ではなく、フックの設定中にクラッシュが発生していると思われます。

4

2 に答える 2

0

同じ DLL が別のディレクトリに配置されたときに異なる動作をする場合は、プラグインがロードされる順序が変更されていることを示唆しています。

( DLL のロード元のディレクトリは、その依存関係を見つけてロードするために使用される検索パスには影響しません)

私は確かに、同じシステムにロードされている他のプラグインを見て、それらの存在があなたのクラッシュを引き起こしているかどうか (あるいは原因でさえあるかどうか) を確認します.

その後、Chrome バイナリのいずれかが破損または破壊された場合に備えて、Chrome をアンインストールして新しいディレクトリに再インストールすることをお勧めします。

于 2013-04-02T00:23:13.840 に答える