2010-02-04 11 views
1

J'ai une application qui lit les paramètres régionaux par défaut de l'utilisateur dans Windows Vista et versions ultérieures. Lorsque j'ai essayé d'appeler l'API pour obtenir l'API Locale par défaut de l'utilisateur, elle plante. Ci-dessous le code, il sera helpfull si tous les points de la raisonL'API GetUserDefaultLocaleName() se bloque

#include <iostream> 
#include <WinNls.h> 
#include <Windows.h> 

int main() 
{ 
    LPWSTR lpLocaleName=NULL; 
    cout << "Calling GetUserDefaultLocaleName"; 
    int ret = GetUserDefaultLocaleName(lpLocaleName, LOCALE_NAME_MAX_LENGTH); 
    cout << lpLocaleName<<endl; 
} 

Répondre

1

En plus des réponses précédentes, vous devez également savoir que vous ne pouvez pas imprimer une chaîne large avec cout; Au lieu de cela, vous devez utiliser wcout. Donc:

#include <iostream> 
#include <WinNls.h> 
#include <Windows.h> 

#define ARRSIZE(arr) (sizeof(arr)/sizeof(*(arr))) 

using namespace std; 

int main() 
{ 
    WCHAR_T localeName[LOCALE_NAME_MAX_LENGTH]={0}; 
    cout<<"Calling GetUserDefaultLocaleName"; 
    int ret = GetUserDefaultLocaleName(localeName,ARRSIZE(localeName)); 
    if(ret==0) 
     cout<<"Cannot retrieve the default locale name."<<endl; 
    else 
     wcout<<localeName<<endl; 
    return 0; 
} 
+0

Oui .. Maintenant, je peux imprimer les paramètres régionaux du système d'exploitation .. Merci beaucoup ... :) – Santhosha

+0

Cette API renvoie le nom de locale comme "en-US "etc .. Puis-je obtenir l'ID de paramètres régionaux à partir de ce nom de paramètres régionaux ?? – Santhosha

1

Je crois que vous devez initialiser lpLocaleName à une chaîne vide de 256 caractères (par exemple) passent alors la longueur (256) où vous avez LOCALE_NAME_MAX_LENGTH

+0

Non, j'avais déjà essayé cela et cela n'a pas aidé! – Santhosha

3

Vous devez avoir lpLocaleName initialisé dans un tampon avant d'appeler l'API. En tant que consensus général, si une API a un paramètre de type de données LPWSTR, appelez le malloc ou le new en premier, à la longueur désirée, dans ce cas, LOCALE_NAME_MAX_LENGTH. Le définir à NULL et le passer à la fonction API est un moyen garanti de planter!

Espérons que cela aide, Cordialement, Tom.

+0

Merci Tom, Cela a résolu mon problème de panne .. Merci beaucoup .. – Santhosha