hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

EBPocketのスマートフォン対応(主にX02HT)について

そんなにスマートフォンが好きですか

EBPocketをX02HTで使用したいという要望があまり多いので、重い腰を上げて調査中。
個人的にはX02HTを買う予定はない。W-ZERO3[es]で間に合っている。

VisualStudio2005の評価版のインストール

まず"Visual Studio 2005 Team Suite 180日間限定評価版"をダウンロードし、インストール。次に"Visual Studio 2005 Service Pack 1"をインストール。
SP1の導入は絶対必要である。Visual Studio 2005のMFC8.0では、EBPocketで使用している重要なクラス(CSplitterWndやCBitmapなど)が削除されていたが、SP1で追加サポートされるようになったからだ。180日限定評価版にSP1が当てられるかどうかが最初の課題だったのだが、問題なく使用できた。
(もちろん移植が成功したらVisualStudio2005の製品版を買う予定だ。だがその頃にはVisualStudio2008が出ている可能性が高いので、とりあえず180日評価版で様子を見ることにした)

EBWinの移植

次に、VisualStudio2005に合わせてC++の修正が必要である。

  • C4996のワーニングを無視するため、#pragma warning(disable: 4996) を追加
  • "for(int i; "の i のような、for文の変数スコープがC++標準準拠になったため、forブロックを抜けると未定義になる件に対応

これで少なくともEBWinはコンパイル・実行が可能になった。
ただしSpeech API 5.1がヘッダがコンパイルエラーになって使用できないのではずす。→ sphelper.h をVisual Studio 2005に合わせて修正する必要あり( http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=147257&SiteID=1 )

EBPocket PocketPC版の移植

さて次にEBPocketのVisualStudio2005対応である。クラス名が変わっていたり、無くなっているものが結構ある。

  • CDumpContextがサポートされない→ 削除する
  • WCE_FCTNがない。現在時刻の取得に使っていたが、CTimeで置き換える
  • SHRecognizeGesture()やSHSipInfo()など、SH*で始まる関数を利用する場合、aygshell.lib のリンクが必要。(eVC++4では、aygshell.hをインクルードするだけでよかった)
  • 標準のプリプロセッサ シンボルが変わっている。PocketPCの場合はWIN32_PLATFORM_PSPC、スマートフォンの場合はWIN32_PLATFORM_WFSPが定義される。
  • ダイアログのリソースに DS_MODALFRAME 属性があると実行時エラーになる。
  • CCeCommandBarはCCommandBarになった。一部のメンバ変数がサポートされなくなっている。
  • メニューハンドルを AfxGetMainWnd()->GetMenu() でとると有効なハンドルが得られないので、SHGetMenu()を使う。

#if (_WIN32_WCE >= 500)
HMENU hmenu = SHGetMenu( m_wndCommandBar.m_hCommandBar );
CMenu *pcTopMenu= CMenu::FromHandle( hmenu );
#else
CMenu* pcTopMenu = AfxGetMainWnd()->GetMenu();
#endif

格闘の末、やっとPocketPC用はビルドできるようになった。

EBPocket スマートフォン対応の試み

次にスマートフォン対応だが、これで頓挫してしまった。VisualStudio2005でスマートフォン用の空のビルドを作ってみて、そのソースを参考に手を加えたが、どうもメニューが作成できない。スマートフォンはトップレベルのメニューが左右の2個しか作れないので、メニュー関連は大改修が必要なのだが、起動するところまでもたどり着けない。また、スマートフォンにはプロパティシートがないことが分かったので、オプション関連を書き換えないといけない。

どうも初めからVisualStudio2005でプロジェクトを作って、そこにEBPocketのコードを継ぎ足していった方が確実に動きそうである。うーん、スマートフォン対応は思ったより大変だ。

X02HTのサポートのためだけだったら、正直の所、かかる作業の労力を考えたら、引き合わないと思う。スマートフォンを別々にサポートしなければならないのは、大変である。ただいずれ mfcce300.dll のサポートが切られると思うので、最新のVisualStudioの対応は避けて通れないところではある。

結局、以下の対処でスマートフォンも動きました。

  • SmartPhoneのCCommandBarには、LoadToolBar()でツールバーをロードしてはいけない
  • トップレベルメニューは左右の2個だけ、階層メニューを作れるのは右側だけ、しかも1階層のみという規約に従う。
  • VisualStudio2005で新しいプロジェクトで"MFCスマートデバイスアプリケーション"を作ると、.rc2 のリソースファイルが自動的に作られるが、こちらのSHMENUBARリソースをコメントアウトしないと、リソースエディタで編集したメニューが表示されない(←これは本当にわからない。かなり悩んだ)
  • CPropertySheet クラス がない→オプションダイアログを全て外す

VisualStudio2005のいいところ

もちろん、VisualStudio2005のいいところもたくさんある。モバイル開発をする者にとっての最大の利点は、ARM用のバイナリがそのままエミュレータデバッグ可能なことだろう。また、Visual Studio 6.0と比較すると、開発支援機能が大幅に充実している。なお、Visual Studio 6.0とプロジェクト名の拡張子がまったく違うので、同じディレクトリにVS6.0とVS2005のプロジェクトを共存することは可能だった。