お仕事で調査中。めもめも。
要するに、IEツールバーを作るには次のようにすればいいらしい。IE5以降でサポートされる。
- IObjectWithSite, IDeskBand, IPersistStream を実装したcoclassをつくる。
- coclassはinproc serverで利用できなくてはならない。つまりは、COMサーバーはDLLでないと駄目。とにかく、そういう形でレジストリにcoclassを登録する。
- それから、HKEY_LOCAL_MACHINE\software\microsoft\Internet Explorer\Toolbarに、"{coclass のCLSID}"という名前の値を登録する。型や中身はどうでもいいみたい?
IObjectWithSiteの実装はこんな感じ。
- ツールバーがactivateされるとき、 IObjectWithSite#SetSite が呼ばれる。パラメータのIUnknownインターフェースは、IOleWIndowをquery可能なので、これを使ってツールバーの親となるウィンドウの情報を取得する。MSDNのサンプルでは、このタイミングでツールバー本体のウィンドウを生成している。
- また、IInputObjectSiteもquery可能なので、あとで入力を処理するときにこれを使う。
- それから、単にツールバーとして表示されると言うだけでなく実質的な機能を提供するなら、このIUnknownでIWebBrowser2をqueryするのは必須。
- IObjectWithSite#GetSiteは単にSetSiteで渡されたIUnknownのQueryInterfaceに転送すればいいらしい。
IPersistStreamは、ツールバーの状態を保存するために適切なタイミングでIEがメソッドを呼んでくれるので、それを考えてよしなに実装。空実装してもとりあえずは問題なし。
IDeskBand::GetBandInfoはバーの大きさやらなんやらの情報を提供するMSDNのサンプルみたいな感じで適当に。