自作のダイアログベースのプログラムが、英語版Windows XPでのみ動かない現象が発生したので調べてみました。
リソースをあれこれいじりましたが、コモンコントロールの初期化を忘れていたのが原因でした。
このおまじないは「コモンコントロールを使う場合は必要」と方々で注意されているのですが、日本語版Windowsでは2000以来ずっと、なくても動いていたので記憶に残らなかったのです。
しかしこうして現実に、英語版にて問題が発生したのでした。建前は偉大です。英語版Vista(Ultimateの言語切り替えではなく英語版)でも試してみましたが、こちらは大丈夫でした。
現象の詳細としては、CreateDialogが失敗、GetLastErrorが6を返します。ERROR_INVALID_HANDLEです。
WM_CREATEは来るのですが、その後WM_SETFONTの直後にWM_DESTROYが来てしまう、という流れでした。WM_INITDIALOGの前に終了します。
日本語版Windowsはどうして問題ないのか謎ですが、お約束は忘れると怖いという話でした。
リソースをあれこれいじりましたが、コモンコントロールの初期化を忘れていたのが原因でした。
InitCommonControlsEx();
このおまじないは「コモンコントロールを使う場合は必要」と方々で注意されているのですが、日本語版Windowsでは2000以来ずっと、なくても動いていたので記憶に残らなかったのです。
しかしこうして現実に、英語版にて問題が発生したのでした。建前は偉大です。英語版Vista(Ultimateの言語切り替えではなく英語版)でも試してみましたが、こちらは大丈夫でした。
ダイアログをデザインしている最中に、どれがコモンコントロールなのかあまり意識しませんから、MFCテンプレートのように常時InitCommonControlsExするのは、多少のメモリ消費が増えるとしても安全と言えます。
現象の詳細としては、CreateDialogが失敗、GetLastErrorが6を返します。ERROR_INVALID_HANDLEです。
WM_CREATEは来るのですが、その後WM_SETFONTの直後にWM_DESTROYが来てしまう、という流れでした。WM_INITDIALOGの前に終了します。
日本語版Windowsはどうして問題ないのか謎ですが、お約束は忘れると怖いという話でした。
コメントする