HTA をホストとするコントロールを作成する時に気付いた事などをまとめています。
mshta は WebBrowser Control のコンテナですが、
WebBrowser Control もコンテナの機能を有しています。
また WebBrowser Control は、
OLE'96 仕様に対応した最新のコンテナでもあります。
WebBrowser Control が作るページ (<BODY>下) に配置された、
テキストボックスやボタンは、ウインドウハンドルを持ちません。
これは、ウインドウレスコントロール である事を意味します。
iexplore.exe も mshta.exe もほとんど同じと考えていいでしょう。
ただし、mshta は、
ステータスバー、external オブジェクト(DOM)、IServiceProvider
などなど、提供しない機能が多々あります。
コントロールがロードされる時の順序
(mshta 6.0)
| IClassFactory/2 |
| IQuickActivate::QuickActivate |
| IOleObject::SetClientSite |
| IViewObjectEx::SetAdvise |
| IOleObject::GetMiscStatus |
| IViewObjectEx::GetViewStatus |
| IPersistPropertyBag::Load |
| IOleObject::SetExtent |
| IOleObject::GetExtent |
| IOleObject::DoVerb(-5) |
| IOleWindow::GetWindow |
| (WM_CREATE) |
| IOleInPlaceObject::SetObjectRects |
コンテナのアンビエンとプロパティにアクセス出来るのは IOleObject::SetClientSite から。
だけど、 IQuickActivate::QuickActivate が先に来る。
ウインドウレスコントロール なら WM_CREATE 系は無し。
IOleInPlaceActiveObject は使われないようだ。
| (WM_DESTORY) |
| IOleInPlaceObject::InPlaceDeactivate |
| IOleInPlaceObject::UIDeactivate |
| IOleObject::Close |
| IOleObject::SetClientSite(NULL) |
| IUnknown::Release |
ウインドウレスコントロール なら WM_DESTROY 系は無し。
自分が mshta で試した事を記述しています。
(まだ、まとめてない・・)
マウスカーソルがコントロール上に来くるまで、
インスタンス化が延滞される模様。
(ページがスクロールして、コントロールが表示されるまで、も同様だと思う)
これの効果は見られなかった・・。