BHO(Browser Helper Object)を使ってDOM拡張を試しているが、どうもうまくいかないようだということに最近気付いてきている。
自作のBHOをインストールすると、動作はするものの、Googleなど先に入っているBHO拡張が無効化されてしまう。アンインストールするとGoogleが復活する。同時には存在できないようだ。
いろいろと調べてみた結果、いま試している方法がまずいようだ。いまやっているのは、
(1)IWebBrowser2を取得する
(2)DWebBrowserEvents2に対して自分をadviseする
(3)DWebBrowserEvents2::InvokeでDISPID_NAVIGATECOMPLETE2を受け取った時にICustomDocを取得する
(4)ICustomDos::SetUIHandlerで自分のIDocHostUIHandlerをセットする。
という流れなのだが、どうもSetUIHandlerだと既存のIDocHostUIHandlerを乗っ取ってしまうようで、既存のUIが殺されてしまう。私のような古い考えの人間はフック→チェーン呼び出しのようなのが当然と考えるのだが、そういう仕組みにはなっていないようだ。
ここに参考になることが書かれていた。
PRB: ICustomDoc::SetUIHandler Causes Changes in Save As Dialog
回避するには
Implement the IDocHostUIHandler interface through the Web browser control client site. Do not call SetUIHandler if the full Save As dialog is important. This means that you must host the Web browser control must be hosted, if it is not already hosted.
と書かれているのだが、イマイチ理解できていない。どうしたものか...