2003-03-31 141203 [長年日記]

GetMenuItemInfo

GetMenuItemInfoを呼ぶときに、MENUITEMINFO::dwTypeDataに0を設定しておくと、cchに必要なバッファの長さが返るはずなのですが、HPC2000だと0が返ってきてしまうようです。メニューの文字列の長さはそれほど長くなることもないと思うので、固定長バッファを使ってそれより長いものは切り捨ててしまっても問題ないとは思いますが、釈然としませんね。

アラインメント

CEの方で突然落ちてしまうので調べていったらアラインメントの問題でした。

unsigned char* p = ...;
size_t n = *reinterpret_cast(p);

みたいなコードがあったのですが、pが4バイトアラインになっていないところがあって落ちていました。データファイルをパースするときなので、本当はデータファイルのフォーマット自体を4バイトアラインになるようにしてしまった方が良い気がしますが、とりあえずのところ、

unsigned char* p = ...;
union {
  char buf_[sizeof(size_t)];
  size_t n_;
} x;
memcpy(x.buf_, p, sizeof(size_t));
size_t n = x.n_;

のようにして回避。リリースする前にはどうするかもう一度考えた方が良さそうですね。

メニューの開放

フレーム用のメニューも動的にロードするようにしたので、フレームを破棄したときにメニューが自動的に破棄されてしまうのは困ります。そこで、WM_DESTROYでSetMenu(hwnd, 0)してメニューを切り離すようにしておいたのですが、HPCだと上手く行かない様子。もともと、CommandBar_InsertMenuExでメニューをセットするので、この引数に0を渡してもう一度呼び出してみましたが、開放してくれないようです。

しょうがないので、メニューハンドルを複製して(といってもループを回してコピーを作るという力技ですが)使うようにしました。これくらい出来ても良いのに>CE。