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のプロジェクトを共存することは可能だった。