2013-07-04 14 views
7

Na Win7 z zlokalizowanym interfejsem użytkownika, error_code::message() zwraca komunikat inny niż angielski. O ile widzę (w Boost, 1,54, dla system_error_category), powyższa funkcja sprowadza się do następującego WinAPI rozmowy:Jak uzyskać boost :: system :: error_code :: message in English?

DWORD retval = ::FormatMessageA( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS, 
    NULL, 
    ev, 
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language 
    (LPSTR) &lpMsgBuf, 
    0, 
    NULL 
); 

Jak zdobyć powyższy FormatMessage powrotu komunikat angielskiego? Próbowałem ustawić lokalizację, zarówno z funkcjami std, jak iz SetThreadLocale - to nie pomogło.

Aktualizacja: Tylko wyjaśnienie: w zasadzie moje pytanie brzmi jak „override” programowo user default language i dlaczego ustawienie regionalne nie wystarczy.

Odpowiedz

1

Podejrzewam, że zamiast domyślnego języka musisz podać angielski zamiast dwLanguageId. Np .:

MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) 

lub, jeśli chcesz konkretnie US English:

MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) 

pamiętać, że to nie powieść, jeśli wiadomość w określonym języku nie istnieje. Więc możesz chcieć obsłużyć numer ERROR_RESOURCE_LANG_NOT_FOUND i spróbować ponownie zadzwonić pod numer dwLanguageId=0.

Aby uzyskać więcej informacji, see MSDN.

+1

Jak już wspomniałem, to nie mój kod, ale Boost.System, który wywołuje 'FormatMessage'. –

+0

Napisz więc swoją własną funkcję. To nie jest trudne. –

+0

Patching Boost jest opcją, ale wolę bardziej czyste rozwiązanie. W rzeczywistości chodzi o to, czy można przesłonić (LANG_NEUTRAL, SUBLANG_DEFAULT), tj. "Domyślny język użytkownika" (http://msdn.microsoft.com/en-us/library/windows/desktop/dd373908(v=vs.85) .aspx). Czy nie powinno wpływać na to ustawienie narodowe wątku lub globalne ustawienia narodowe? –

3

Szukałem w Internecie rozwiązania, a na końcu znalazłem this. Zasadniczo powinieneś zadzwonić pod numer SetThreadUILanguage w swoim main/WinMain.