2006-06-24 [長年日記]

[Q3] Windows Mobile 5.0版

Windows CE版がVC8でビルドできるようになったので、Windows Mobile 5.0のSDKでのビルドも試してみました。SDKのヘッダ内で警告がひとつ出る*1のは直せばよいのですが、少し大きな問題としてIBrowser2がサポートされていないというのがあります。

いくつか調べてみた結果以下のことがわかりました。

  • IBrowser(1|2|3)はdeprecated*2
  • DTM_BROWSERDISPATCHからは何らかのIDispatchが得られる
  • Pocket PC 2003のSDKでビルドした実行ファイルで試してみると、得られたIDispatchからIBrowser2をQueryInterfaceすると成功する
  • しかし得られたIBrowser2からの呼び出しはことごとく失敗する(HRESULTは0x80070002)
  • Windows Mobile 5.0のSDKでビルドして、IDispatch::Invoke経由で呼び出しても同じエラーになる
  • IDispatchからIWebBrowser2をQueryInterfaceすると失敗する

というわけで、現在のPocket PC 2003版をWindows Mobile 5.0で使っている場合でもHTML表示の一部の機能はちゃんと機能していないようです。

Windows Mobile 5.0では新たにPIEWebBrowserというcoclassが新設されていてIWebBrowser2(の一部)をサポートしているようです。これは、Windows版のWebBrowserコントロールと同様にActive Xコントロールとしてホストできるようです。ただし、Windows版だとIWebBrowser2#get_Documentから得られるIHtmlDocument2あたりのインターフェイスはサポートされていないようで、Windows版のコードをそのまま使い回しできるわけではありません*3。このあたりについては、MiniPIEというサンプルを見るとある程度わかります。

ついでに、VC8についているCE版のATLではMTA内でActive Xコントロールをホストするのを(正しく)禁止するようになったらしく、そのままではそのあたりが使えなくなっています。ただし、基本的にはMTAしかないCEではこれでは困るので、_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTAというマクロを定義するとMTAの中でActive Xコントロールをホストできるようになります。ただし、STAのように別スレッドからの呼び出しをシリアライズしてくれないので必要があれば自分でスレッドを切り替える必要があるということのようです。

*1  例によってCP932では扱えない文字(0xa0)が入っている

*2  以前からそう書いてありましたが早すぎる気が…

*3  sigmarion III版ではほぼそのまま使いまわしできます

[]