BHO(Browser Helper Object)とDOM拡張はなんとか動くようになった(ように見える)。
実際にはCOMとかOLEとかATLとかその辺を全く理解していないのでちゃんとあるべき姿で動いているかどうかがわからない・・・
- BHOがロードされる
- IWebBrowser2を取得する
- DWebBrowserEvent2にIDispatchを公開する
- IDispatch::Invoke()を通じてDISPID_NAVIGATECOMPLETE2が来ると、ICustomDocを取得する
- ICustomDoc::SetUIHandler()を使ってIDocHostUIHandlerをカスタマイズする
- IDocHostUIHandler::GetExternal()でwindow.externalを拡張する
といった流れになる。
現在のところページ内から window.external.sayhello(); を実行すると印刷ダイアログが表示されるようにはなった。
しかし、右クリック拡張で呼ばれるスクリプトファイル内から window.external.sayhello(); しようとすると、window.external は null だと言われてしまいどうもうまく動作しない。
まだ何か足りないのかもしれない。