Для некоторых справочной информации посмотрите здесь:
http://www.siao2.com/2010/03/19/9980203.aspx
Так что, кажется, эта проблема проявляется на Vista, а также Windows 7.Это происходит из-за того, что Microsoft, похоже, находится в процессе устаревания Locale ID в пользу Название локали.
Подводя итог: соответствующие вызовы API работают со значениями реестра, которые можно найти по адресу HKCU\Control Panel\International
. Значение «Locale» поддерживается по соображениям обратной совместимости и при нормальных обстоятельствах сохраняется в синхронизации с его новым коллегой под названием «LocaleName». Однако этот синхронный процесс не работает при некоторых обстоятельствах.
Во всяком случае, вызов GetThreadLocale
API получает возвращаемое значение из «Locale» реестр, упомянутых выше, в то время как другие (GetUserDefaultLCID
, GetSystemDefaultLCID
и т.д.) использовать запись реестра «LocaleName».
Отсюда путаница.
КСТАТИ, решение упоминается JP in a previous post, вероятно, должен быть продлен до
initialization
SetThreadLocale(GetUserDefaultLCID);
GetFormatSettings;
, потому что (если я правильно читать это!) В соответствии с docco вызов GetUserDefaultLCID будет приходиться на пользовательские параметры.
После немного большего исследования Vista не затронута вообще. У меня есть еще несколько деталей ...
Соответствующие вызовы API работают со значениями реестра, которые можно найти по адресу HKCU\Control Panel\International
. Значение «Locale» поддерживается по соображениям обратной совместимости и при нормальных обстоятельствах синхронизируется с его новым коллегой под названием «LocaleName». В Windows 7, по крайней мере, этот процесс синхронизации, однако, не работает, когда процессы запускаются как другой пользователь (т. Е. RunAs или олицетворение). Похоже, что это происходит во время установки, когда установщик запускается из существующего сеанса Windows. Однако он работает правильно, если вы загрузились с установочного компакт-диска.
GetThreadLocale
получает свое значение от Thread Information Block или Thread Environment Block (TIB или TEB) См: http://en.wikipedia.org/wiki/Thread_Environment_Block Для обоих Vista, и Windows 7, то ИРТ инициализирован с вводом в HKCU\Control Panel\International\Locale
реестра при входе в систему. Это становится стандартным языком для всех потоков, созданных во время сеанса. Изменение этого значения реестра во время сеанса не влияет на значение, возвращаемое вызовом API GetThreadLocale. Чтобы просмотреть изменения, пользователь должен выйти из системы и снова войти в систему. Это вызов API, который Delphi использует в качестве основы для инициализации всех его строк формата локали (см. Метод SysUtils.GetFormatSettings
), из которого форматируются все поля даты.
GetUserDefaultLCID
: в Vista, основывает свое возвращаемое значение на записи реестра . В Windows 7 основывается его возвращаемое значение в записи реестра HKCU\Control Panel\International\LocaleName
. Соответствующая запись в реестре может быть изменена во время сеанса, и результат немедленно отражается в этом возвращаемом значении вызова API.
SetThreadLocale
обновляет TIB, чтобы отразить языковой стандарт, указанный в параметре этого вызова. Обратите внимание, что это только когда-либо влияет на поток, из которого выполняется вызов API. API-вызовы SetThreadLocale(LOCALE_USER_DEFAULT)
и SetThreadLocale(GetUserDefaultLCID)
функционально эквивалентны. Они оба получают исходный язык, как описано выше в API-интерфейсе GetUserDefaultLCID
.
Вы фактически используете несколько потоков, или вы просто вызываете GetThreadLocale из основного потока? –