2013-07-04 10 views
7

Su Win7 con interfaccia utente localizzata, error_code::message() restituisce un messaggio non in inglese. Per quanto riguarda la vedo (in Boost 1.54, per system_error_category), la funzione di cui sopra si riduce al seguente chiamata WinAPI:Come ottenere boost :: system :: error_code :: message in inglese?

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

Come ottenere quanto sopra FormatMessage di restituire un messaggio di inglese? Ho provato ad impostare le impostazioni internazionali, entrambe con le funzioni std e con SetThreadLocale - non ha aiutato.

Aggiornamento: Solo una precisazione: in sostanza, la mia domanda è come "override" di programmazione la user default language e perché impostare il locale non è sufficiente.

risposta

1

A titolo di prova, è necessario specificare l'inglese per dwLanguageId anziché la lingua predefinita. Es .:

MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) 

o, se si vuole specificamente inglese degli Stati Uniti:

MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) 

Si noti che questa avrà esito negativo se il messaggio nella lingua specificata non è presente. Quindi potresti voler gestire ERROR_RESOURCE_LANG_NOT_FOUND e provare a chiamarlo di nuovo con dwLanguageId=0.

Per ulteriori informazioni, see MSDN.

+1

Come ho già detto, non è il mio codice, ma Boost.System che chiama 'FormatMessage'. –

+0

Bene, scrivi la tua funzione allora. Non è difficile. –

+0

Patching Boost è un'opzione, ma preferirei una soluzione più pulita. In realtà, la domanda è se è possibile eseguire l'override (LANG_NEUTRAL, SUBLANG_DEFAULT), ovvero "Lingua predefinita utente" (http://msdn.microsoft.com/en-us/library/windows/desktop/dd373908(v=vs.85) aspx). Non dovrebbe influenzare la locale o la locale globale? –

3

Stato cercato su Internet per soluzione, e infine trovato this. Fondamentalmente, è necessario chiamare SetThreadUILanguage nel numero main/WinMain.

Problemi correlati