Windows Mobile SDK でサポートしていない API や機能のまとめ

Windows Mobile SDK とデスクトップ SDK を比較して、Windows Mobile がサポートしていない機能とその代替策をまとめてみました。

※Windows Mobile 6 Professional SDKを対象としています。

※少しずつ記述しています。

[MSDN] http://msdn.microsoft.com/en-us/default.aspx

パイプ

プロセス間通信に使う CreatePipe API など、パイプはサポートしていない。共有メモリ、イベント、セマフォを組み合わせて自作する。

OpenSemaphore、OpenFileMapping

OpenSemaphore、OpenFileMapping はサポートしていない。 作成済みの名前つきセマフォ、ファイルマッピングオブジェクトを取得する場合、 CreateSemaphore、CreateFileMapping を使用する。

※OpenEvent はサポートしている。

ReadFileEx WriteFileEx

非同期でリードライトを行う API はサポートしていない。OVERLAPPED もサポートしていない。ファイルの読み書きをメインスレッドとは別のスレッドで行えば非同期で処理される(と思った、、メモ損失のため未検証とする)。

Shell Path Handling Functions

デスクトップ SDK の shlwapi.h、shlwapi.lib に含まれる、パス処理を行う PathIsRelative、PathRemoveFileSpec などはサポートしていない。自作するしかない。 shlwapi.h は Windows Mobile 向けに提供されてはいるが、中身は全く異なる。

SHGetPathFromIDList

サポートしていない。 フォルダ選択ダイアログは自作するしかない。

beginthread、endthread

スレッドの開始は CreateThread を用いる。

GetWindowLong の GWL_HINSTANCE

WinMain の引数のインスタンスハンドルを変数で保持しておく。

TrackPopupMenuEx

TrackPopupMenuを使う。

WM_NCCREATEメッセージ

サポートしていない。 (デスクトップの場合、WM_NCCREATE の次に WM_CREATE が送られてくる。従って、WM_CREATE でウィンドウフレームに処理を施せばよいか?)

WM_WINDOWPOSCHANGINGメッセージ

サポートしていない。縦横の画面向きの変更であれば WM_SIZE でハンドルできる。WM_WINDOWPOSCHANGED はサポートする。(ユーザがサイズを変更できるウィンドウで、サイズの変更をキャンセルしたい場合は、WM_WINDOWPOSCHANGED でハンドルして、無限再帰しないような処理を作って SetWindowPos で戻す方法しかないか?)

SetWindowPlacement、IsIconic、IsZoomed、CloseWindow、OpenIcon

サポートしていない。最大・最小表示はない。通常のウィンドウサイズは GetWindowRect で取得できる。

  • OpenIcon の代替案、ウィンドウの復元
::SetForegroundWindow(hWnd)
  • CloseWindow の代替案、ウィンドウの最小化
::SetWindowPos(hWnd,
      HWND_BOTTOM,
      0, 0, 0, 0,
      SWP_NOACTIVATE | SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE);
::ShowWindow(hWnd, SW_SHOW);


一度ウィンドウを非表示にしてアクティブ状態を解放、同時に Z オーダを最背面に移す。 そしてウィンドウの表示を戻す。

SWP_HIDEWINDOW を付加(非表示)しない場合、フレームウィンドウは最背面へ移動するが、上下のバーにアプリの表示状態が残る。

[OK] ボタンの押下をシミュレートする方法が、Windows Mobile の Shell API で実現できればよいのだが、見当たらない。もっと綺麗な方法が欲しいところ。

ShowScrollBar、EnableScrollBar

スクロールバーのウィンドウハンドルがあれば、ShowWindow、EnableWindow を呼び出す。

ウィンドウの水平・垂直スクロールバーの場合、

  • 表示・非表示するとき、SetWindowLong の GWL_STYLE 値に WS_HSCROLL と WS_VSCROLL フラグをセット(またはリセット)する。
  • 有効・無効するとき、SetScrollInfo に SB_HORZ か SB_VERT を指定して、SCROLLINFO 構造体の fMask メンバに SIF_DISABLENOSCROLL をセット(またはリセット)する。

SetMenu

Windows Mobileの場合、フレームウィンドウのメニューは SHCreateMenuBar で設定する。このメニューはツールバーなので注意。

Direct3D

Direct 3D Mobile を使う。

[MSDN/CE 5.0] http://msdn.microsoft.com/en-us/library/aa452478.aspx

[MSDN/WM6] http://msdn.microsoft.com/en-us/library/aa921056.aspx

DirectSound

実装はされているが推奨していない。代わりに Waveform Audio API の使用を推奨している。

[MSDN] http://msdn2.microsoft.com/en-us/library/aa446919.aspx

DirectMusic

サポートしていない。

midiOutOpen などの MIDI 制御

サポートしていない。

LoadImage

代わりに SHLoadDIBitmap を使う。ただし、SHLoadDIBitmap はビットマップしか読めない。Windows Mobile 6 以上の環境であれば、Imaging API を使用すれば Jpeg、PNG、Gif を読み込める。

[MSDN/Imaging] http://msdn.microsoft.com/en-us/library/ms932606.aspx




Last-modified: 2011-04-12 (火) 06:28:28 (2496d)