Pour des informations générales ont un coup d'oeil ici:
http://www.siao2.com/2010/03/19/9980203.aspx
Il semble que ce problème se manifeste sur Vista ainsi que Windows 7.Il se produit parce que Microsoft semble être en train de déprécier le ID de paramètres régionaux en faveur du nom de l'environnement.
En résumé: Les appels d'API pertinents fonctionnent tous sur des valeurs de registre qui peuvent être trouvées à HKCU\Control Panel\International
. La valeur "Locale" est conservée pour des raisons de rétrocompatibilité et, dans des circonstances normales, reste synchronisée avec sa contrepartie la plus récente appelée "LocaleName". Ce processus de synchronisation ne fonctionne cependant pas dans certaines circonstances.
Quoi qu'il en soit, l'appel API GetThreadLocale
obtient sa valeur de retour de l'entrée de Registre « Locale » mentionné ci-dessus, tandis que les autres (GetUserDefaultLCID
, GetSystemDefaultLCID
, etc) utilisent l'entrée de Registre « nomlocale ».
D'où la confusion.
BTW, la solution mentionnée par JP in a previous post devrait probablement être étendue à
initialization
SetThreadLocale(GetUserDefaultLCID);
GetFormatSettings;
parce que (si je lis correctement!) Selon le Docco l'appel GetUserDefaultLCID représentera personnalisations.
Après un peu plus de recherche, Vista n'est pas affecté du tout. J'ai aussi plus de détails ...
Les appels d'API pertinents fonctionnent tous sur des valeurs de registre qui peuvent être trouvées à HKCU\Control Panel\International
. La valeur "Locale" est conservée pour des raisons de compatibilité ascendante et, dans des circonstances normales, est synchronisée avec sa contrepartie plus récente appelée "LocaleName". Sous Windows 7 au moins, ce processus de synchronisation ne fonctionne cependant pas lorsque les processus sont exécutés en tant qu'autre utilisateur (c'est-à-dire, RunAs ou Impersonation). Cela semble être le cas lors de l'installation, où le programme d'installation est lancé à partir d'une session Windows existante. Cela semble toutefois fonctionner correctement si vous avez démarré à partir du CD d'installation.
GetThreadLocale
obtient sa valeur de fil Informations sur le bloc ou le fil de l'environnement Block (TIB ou TEB) Voir: http://en.wikipedia.org/wiki/Thread_Environment_Block Pour les deux Vista et Windows 7, la TIB est initialisée avec l'entrée de Registre HKCU\Control Panel\International\Locale
à l'ouverture de session. Cela devient le paramètre régional par défaut pour tous les threads créés pendant la session. La modification de cette valeur de registre au cours d'une session n'a aucun effet sur la valeur renvoyée par l'appel de l'API GetThreadLocale. L'utilisateur doit se déconnecter et se reconnecter pour voir un changement. Il s'agit de l'appel API que Delphi utilise comme base pour initialiser toutes ses chaînes de format de paramètres régionaux (voir la méthode SysUtils.GetFormatSettings
), à partir de laquelle tous les champs de date sont mis en forme.
GetUserDefaultLCID
: dans Vista, base sa valeur de retour sur l'entrée de registre HKCU\Control Panel\International\Locale
. Dans Windows 7, base sa valeur de retour sur l'entrée de registre HKCU\Control Panel\International\LocaleName
. L'entrée de registre respective peut être modifiée pendant une session et le résultat est immédiatement reflété dans cette valeur de retour d'appel d'API.
SetThreadLocale
met à jour le TIB pour refléter les paramètres régionaux fournis dans le paramètre de cet appel. Notez que cela affecte uniquement le thread à partir duquel l'appel d'API est exécuté. Les appels d'API et SetThreadLocale(GetUserDefaultLCID)
sont fonctionnellement équivalents. Ils dérivent tous les deux les paramètres régionaux source comme décrit dans l'appel API GetUserDefaultLCID
ci-dessus.
Utilisez-vous réellement plusieurs threads, ou appelez-vous simplement GetThreadLocale à partir du thread principal? –