2013-07-04 13 views
7

Auf Win7 mit lokalisierter Benutzeroberfläche gibt error_code::message() eine nicht englische Nachricht zurück. Soweit ich (in-Boost 1,54, für system_error_category) zu sehen, die die obige Funktion läuft auf den folgenden WinAPI Aufruf unten:Wie bekomme ich boost :: system :: error_code :: message auf Englisch?

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 
); 

Wie die oben FormatMessage erhält eine englische Nachricht zurück? Ich habe versucht, das Gebietsschema, sowohl mit std Funktionen und mit SetThreadLocale - es hat nicht geholfen.

Update: Nur eine Klarstellung: im Wesentlichen, meine Frage ist, wie programmgesteuert die user default language "überschreiben" und warum Einstellung Gebietsschema ist nicht genug.

Antwort

1

Bei einer Schätzung müssen Sie Englisch für dwLanguageId anstelle der Standardsprache angeben. Z.B .:

MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) 

oder, wenn Sie speziell US-Englisch wollen:

MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) 

Beachten Sie, dass dies nicht gelingen wird, wenn die Nachricht in der angegebenen Sprache nicht vorhanden ist. So können Sie mit ERROR_RESOURCE_LANG_NOT_FOUND umgehen und versuchen, es erneut mit dwLanguageId=0 aufrufen.

Für weitere Informationen, see MSDN.

+1

Wie ich bereits erwähnt habe, ist es nicht mein Code, sondern Boost.System, das 'FormatMessage' aufruft. –

+0

Nun, schreiben Sie Ihre eigene Funktion dann. Es ist nicht schwer. –

+0

Patching Boost ist eine Option, aber ich würde eine sauberere Lösung bevorzugen. Tatsächlich ist die Frage, ob es möglich ist, zu überschreiben (LANG_NEUTRAL, SUBLANG_DEFAULT), dh "Benutzerstandardsprache" (http://msdn.microsoft.com/en-us/library/windows/desktop/dd373908(v=vs.85)) .aspx). Sollte sich das Thread-Gebietsschema oder das globale Gebietsschema nicht darauf auswirken? –

3

Suche im ganzen Internet nach Lösung, und schließlich gefunden this. Grundsätzlich sollten Sie SetThreadUILanguage in Ihrem main/WinMain anrufen.

Verwandte Themen