WinInet をフックして IE からの一部の HTTP 要求を内部サーバーにリダイレクトすることで変更する Internet Explorer 用の BHO を作成しました。
IE で最初の 3 つのタブを開くと、タブごとに新しい iexplore.exe プロセスが作成され、それぞれが BHO をロードするため、正常に動作します。
4 つ以上のタブがある場合に問題が発生します。新しい iexplore.exe プロセスを作成する代わりに、既存のプロセスが別のスレッドで再利用されます。同じプロセスを複数回 (スレッドごとに 1 つ) フックすることも、1 回だけフックすることもできます。どちらの場合も、タブを閉じるとクラッシュが発生します。
例: タブ 1 (別の iepxlore.exe)、2 (別の iepxlore.exe)、3 (別の iepxlore.exe)、および 4 (タブ 1 で iexplore を共有) を開きます。タブ 1 を閉じます。タブ 4 を更新すると、NDTDLL.DLL 内で IE がクラッシュします。フックされた WinInet.ddl 内で何もしないと、クラッシュが発生します (古い関数を呼び出すだけです)。
WinInet を iexplore.exe プロセスごとに 1 回だけフックすると、すべてのタブで要求をインターセプトできなくなります。
どのように進めていくのがベストなのか悩んでいます。これまでに見つけたすべての例では、タブごとに 1 つの iexpolore.exe プロセスがあると想定しています。
WinInet フック コードは、コード プロジェクトの例に基づいています。フックする関数を減らしただけです。
古い WinInet 関数へのポインタ、または私が作成した関数へのポインタが無効になっているようです。