API GetUserDefaultLocaleName () аварийно завершает работу - PullRequest
1 голос
/ 04 февраля 2010

У меня есть одно приложение, которое читает язык пользователя по умолчанию в Windows Vista и выше. Когда я пытался вызвать API для получения пользовательского языка по умолчанию, происходит сбой. Ниже приведен код, это будет полезно, если какие-либо пункты указывают причину

#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;
}

Ответы [ 3 ]

3 голосов
/ 04 февраля 2010

Вам необходимо инициализировать lpLocaleName в буфере до вызова API. По общему мнению, если API имеет параметр типа данных LPWSTR, сначала вызовите malloc или new для него необходимой длины, в данном случае LOCALE_NAME_MAX_LENGTH. Установка его на NULL и передача его функции API - гарантированный способ сбоя!

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1 голос
/ 04 февраля 2010

В дополнение к предыдущим ответам вы также должны знать, что вы не можете напечатать широкую строку cout;вместо этого вы должны использовать wcout.Итак:

#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;
}
1 голос
/ 04 февраля 2010

Я считаю, что вам нужно инициализировать lpLocaleName пустой строкой из 256 символов (например), а затем передать длину (256), где у вас есть LOCALE_NAME_MAX_LENGTH

...