Pocket PCではSHCreateMenuBarでメニューを作りますが、リソースから作ることしか出来ません(Pocket PC 2002では、フラグを指定すればHMENUから作成できるようです)。そこで、自前で作る方法を。まず、リソースに以下を追加します。
IDR_EMPTY RCDATA DISCARDABLE PURE BEGIN IDR_EMPTY, 0, END
IDR_EMPTYは適当に定義しておきます。そして、このリソースで空のメニューを作ってから、TB_INSERTBUTTONでメニューを追加していきます。ここで面倒くさがって、SHCMBF_EMPTYBARを指定して空のメニューを作ると、以降の追加も出来なくなってしまうようなので注意です。
HINSTANCE hInst = ...; // リソースが含まれているEXE/DLLのハンドル HWND hwnd = ...; // フレームウィンドウのハンドル HMENU hmenu = ...; // このメニューハンドルから作る SHMENUBARINFO mbi = { sizeof(mbi), hwnd, 0, IDR_EMPTY, hInst, 0, 0 }; ::SHCreateMenuBar(&mbi); HWND hwndMenu = mbi.hwndMB; int nId = 1000; TCHAR tszText[256]; for (int n = 0; ; ++n) { MENUITEMINFO mii = { sizeof(mii), MIIM_TYPE | MIIM_SUBMENU, 0, 0, 0, 0, 0, 0, 0, tszText, sizeof(tszText)/sizeof(tszText[0]) - 1, }; if (!::GetMenuItemInfo(hmenu, n, TRUE, &mii)) break; #define TBSTYLE_NO_DROPDOWN_ARROW 0x0080 TBBUTTON button = { I_IMAGENONE, nId++, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_NO_DROPDOWN_ARROW | TBSTYLE_AUTOSIZE, { 0, 0 }, reinterpret_cast(mii.hSubMenu), reinterpret_cast (tszText) }; ::SendMessage(hwndMenu, TB_INSERTBUTTON, n, reinterpret_cast (&button)); }
エラー処理は省いてあります。
IMLangConvertCharset::DoConversionFromUnicodeやDoConversionToUnicodeをするときには必要なバッファのサイズを知るために、
IMLangConvertCharset* pCharset = ...; WCHAR* p = ...; UINT nLen = ...; UINT nDstLen = 0; pCharset->DoConversionFromUnicode(p, &nLen, 0, &nDstLen);
のようにまず呼び出すのですが、Pocket PCのMLangだとこのときにnLenの値が0に書き換わってしまうようです。他のプラットフォームではならなかった(同じWindows CE 3.00系のHPC2000でもならなかった)のですが、Pocket PCの実装だけ別なんでしょうか。処理した長さがセットされるという観点からすれば、Pocket PCの動作が正しい気もしますが。。
ついでに、nLenに0をセットして呼び出すとE_FAILになってしまう模様です。S_OKでいい気がするんですけどね。