今回、自分ではソースは組みません。
Wizardで生成されるものをそのまま使って、動くのを確認するだけです。
まずはVS2005を立ち上げて、プロジェクトの新規作成を選択。
Visual C++のスマートデバイスから、「Win32 スマート デバイス プロジェクト」を選択。
適当にプロジェクト名を入れてOK。
Wizardで、「プラットフォーム」をクリックし、「Windows Mobile 6 Professional SDK」を選択。
アプリケーションの設定は、そのままで。
で、完了を押下。
すると、プロジェクトが作成され、デフォルトソースが表示されます。
おおまかなところは、普通のWindowsプログラムと変わらないソースですね。
SHInitExtraControlsとか、SHACTIVATEINFO構造体、SHMENUBARINFO構造体、SHHandleWMActivate、SHHandleWMSettingChange、SHINITDLGINFO構造体あたりは、普通のWin32プログラムでは見ませんね。
SHなんとかっていうAPIを見ると、shell32とかshlwapi系を思い出しますけど、あんまり関係はないのかしら……。
まぁ、このへんの詳細は後で調べるとして、プロジェクトの設定をまずは変更します。
構成プロパティの、配置デバイスを、「JPN Windows Mobile 6 Professional Emulator」にします。
これで、デバッグ開始時に、日本語用エミュレータで実行されます。
で、そのままビルドして、デバッグを開始します。
(この窓がアクティブな状態でPrint Screen押しても、スクショ撮れなかった……)
日本語のエミュレータが立ち上がって、その後、今デバッグを開始したプログラムがエミュレータ上で実行されます。
まぁ、Windowが開いて、右下のヘルプ→バージョン情報でバージョンが表示されるだけですが。
左下のOKをクリックすると、終了します。
最初の起動は、すごく遅いと思います。
エミュレータ上でWindows Mobileが実際に起動するのが重いんです。
エミュレータ終了時に、エミュレータの状態を保存するかどうか聞かれるので、保存しておくと、次回からはその状態で起動するので、時間の短縮になります。
状態を保存するときは、自分のプログラムは終了した状態で保存しておいたほうがいいかもしれませんね。
次に、実機で起動してみます。
やっぱり、実機で動かして、しかもそのままデバッグが出来ると楽ですね。
上でエミュレータを設定した、構成プロパティの、配置デバイスを、「Windows Mobile 6 Professional Device」にします。
予め、Hybrid W-ZERO3とPCをUSBで繋ぎ、Active Syncが立ち上がった状態にしておきます。
これで、デバッグを開始すると、初回はいくつかのファイルが、実機上にインストールされます。
メモった感じでは、以下の6ファイル+自分の作成したプログラムでした。
\Windows\CoreCon1.1 ClientShutdown.exe ConManClient2.exe CMAccept.exe
\Windows TcoConnectionA.dll edm.exe
場所不明 edbgtl.dll
\Program Files\wmtest wmtest.exe(今回作成したもの)
その後、デバッグが開始され、今回作成したプログラムが、実機上で実行されます。
ちゃんと、ブレークポイントを置いてデバッグも出来ます。
こりゃあ、組み込みプログラムより楽だw
ついでに、実行中の実機のスクリーンショットを撮りたい場合、VS2005のスタートメニューのリモートツールにある、リモートズームインを使用することが出来ます。
デバッグ中にリモートズームインを起動して、「Windows Mobile 6 Professional Device」を選択すると、その時のスクショが転送されてくるので、保存するなりすればOK。
初回起動時は、以下のファイルのインストールがされました。
\Windows cczcli.exe
てか、さっきのエミュのスクショも、これで撮れるのかも……?
あと、窓の中身が白いから、ここに貼った見た目が微妙……。
ついでに、ソースをざっと眺めてみますか。
まず、エントリポイントのWinMain関数ですが、InitInstanceで初期化して、アクセラレータをロードして、終了するまでメッセージのループという、基本的なWinプログラムですね。
リソースファイルはなぜか2つ作られており、片方はメニューのみが定義されています。
この、SHMENUBARという名前のメニュー定義は、左下と右下のボタンの定義になるみたいですね。
上の画像で言えば、OKとヘルプが定義されています。
で、これとは別の方のリソースファイルに、アクセラレータが定義されており、IDM_OKとIDM_HELP_ABOUTがそれぞれ。Ctrl+QとCtrl+Aに割り当てられているようです。
InitInstanceでは、SHInitExtraControlsを呼んでおり、これでエディットコントロールや、文字入力パネルコントロールの初期化等を行う必要があるようです。
その後、ストリングテーブルを読み込み、同名のWindowが既にあればそれにフォーカスを与えて終了、なければ自分のWindowを作成して、サイズ調整、Window表示を行っています。
メインWindowのウィンドウプロシージャは、WM_COMMANDでOKボタンとヘルプボタンの処理、WM_CREATEではメニューを作っているようですが、先程の二つのリソースの、それぞれのメニューの関係がよくわからんですね……。
メニューについてはそのうち。
WM_PAINTでは、特に何も描画せず、背景クリアして無効領域がクリアされるだけのようです。
WM_DESTROYでは、メニューを破棄してアプリを終了しています。
WM_ACTIVATEはSHHandleWMActivateを呼んでいますが、ヘルプに入力パネルをリストアするとかあるので、これをやらないと、正しく日本語入力出来なくなったりするんですかね。
WM_SETTINGCHANGEではSHHandleWMSettingChangeを呼んでいますが、これもWM_ACTIVATEと同じような理由ですかね。
あんまり詳細は見ていませんが……。