Windows 2000でインバリアント・カルチャは使えない

以前、一部のアンパッカーをXP互換モードで実行すると、【Class TBitmapImage not found】 が発生する問題がありました。

Innounp Packer で圧縮されたファイルを解凍する


これの原因を調べてみたところ、CompareString の第1パラメータに Windows 2000 の場合は、 LCID = 0x409 (英語圏)
Windows XP の場合は LCID = 0x7f を渡していることが分かりました。

試しにサンプルプログラムを実行してみると、 LCID=0x7fを渡すと、XPでは正常終了するのに、 2000では 0x00000057 (パラメータが間違っています/ERROR_INVALID_PARAMETER 87) になってしまいます。

kernel32.dllのコードを解析してみると、XPでは 0x7fを処理しているのに、2000では処理していないことが判明しました。

で、0x7fというのは何かというと、インバリアントカルチャー識別子といい、マルチ言語に対応したいソフトを作るときに、自動で言語を選択してもらうときに割り当てるものだそうです。

CultureInfo.DateTimeFormat プロパティとは - .NET Framework クラス ライブラリ リファレンス Weblio辞書

チェックしてみると、利用してる関数は kernel32.dll内だけで以下の通り

CompareStringA
CompareStringW
EnumCalendarInfoA
EnumCalendarInfoExA
EnumCalendarInfoExW
EnumCalendarInfoW
EnumDateFormatsA
EnumDateFormatsExA
EnumDateFormatsExW
EnumDateFormatsW
EnumLanguageGroupLocalesA
EnumLanguageGroupLocalesW
EnumSystemCodePagesA
EnumSystemCodePagesW
EnumSystemLanguageGroupsA
EnumSystemLanguageGroupsW
EnumSystemLocalesA
EnumSystemLocalesW
EnumTimeFormatsA
EnumTimeFormatsW
EnumUILanguagesA
EnumUILanguagesW
GetCalendarInfoA
GetCalendarInfoW
GetCPInfoExW
GetCurrencyFormatA
GetCurrencyFormatW
GetDateFormatA
GetDateFormatW
GetGeoInfoW
GetLocaleInfoA
GetNumberFormatA
GetNumberFormatW
GetStringTypeA
GetStringTypeExW
GetTimeFormatA
GetTimeFormatW
IsDBCSLeadByteEx
LCMapStringA
LCMapStringW
MultiByteToWideChar
SetCalendarInfoA
SetCalendarInfoW
SetLocaleInfoA
SetLocaleInfoW
SetThreadLocale
WideCharToMultiByte

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です