wxWidgetsに平和が訪れました

前のブログから復元するのがたいへんなので、そのまま再掲はしていませんが、以前、「Visal C++ 2008やWindows SDK VistaでコンパイルしたwxWidgetsは、それ以前のSDKでコンパイルしたものと異なるバイナリになる」「Vistaでは正常だが、XPではメニューのオーナードローに失敗する」という件について、原因を調べ、修正方法の是非についてブログコメントで議論してたことがありました。

たまたま同じ現象で困っている人が海外にもいて、
menu with bitmaps not shown in XP if compiled on Vista - comp.soft-sys.wxwindows | Google Groups
という報告をされており、wxWidgetsの開発プロジェクトでは、最終安定版のリリース以降、
[wx] Diff of /wxWidgets/branches/WX_2_8_BRANCH/src/msw/ownerdrw.cpp
と修正して、問題解決してありました。で、このソースから、以下のように結論がでました。

  1. Vista用のSDKではNONCLIENTMETRICS構造体の大きさが拡張されているために、コンパイル時に決定されてしまうsizeof(NONCLIENTMETRICS)がint値ひとつぶん大きな値となってobjファイルに焼きこまれてしまう。
  2. そのオブジェクトコードを含む実行可能ファイルがWindows XPで実行されると、XPのSystemParametersInfoではそんな大きな構造体サイズを想定していないので、呼び出しに失敗する。
  3. つまり、XP以下で動いていたソースを最新SDKでビルドしたものは、何の努力もしなければXP非互換なバイナリになる。

これは、VistaとXP以下の両方で動くよう、意識して書き分けないといけない箇所のひとつだけど、悪いことに明確に文書化されておらず、また、ソースレベルの互換性をとても意識しにくい、という嫌な問題でした。

----さて、

Vista対応のWindows SDKはさておき、wxWidgetsのほうはというと、wxWidgets 2.8.8として、2008-06-24に上記の修正を含んだ安定板がリリースされていました。

http://www.wxwidgets.org/

Fix assert when using owner-drawn menu items with the newest (Vista) SDK.

これで、VC++2008でXP互換のあるwxWidgetsのプログラムを書けるようになりました。次のWindowsかIE8までは、この平和が続くことでしょう。めでたしめでたし。
※ええ、もういいんです、VistaVistaSDKだけで…。次のWindowsではどうせ別のところに同種の問題があって、またそのままじゃ使えなくなるだろうから(^^;