2013-07-04 1 views
7

На Win7 с локализованным пользовательским интерфейсом error_code::message() возвращает неанглийское сообщение. Насколько я вижу (в Boost, 1.54, для system_error_category), выше функция сводится к следующему вызову WinAPI:Как получить boost :: system :: error_code :: сообщение на английском языке?

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

Как получить выше FormatMessage вернуть сообщение на английском? Я попытался установить локаль, как с функциями std, так и с SetThreadLocale - это не помогло.

Обновление: Просто уточнение: по сути, мой вопрос заключается в том, как «переопределить» программно user default language и почему локализация установки недостаточно.

ответ

1

Предположим, что вам нужно указать английский язык для dwLanguageId вместо языка по умолчанию. Например .:

MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) 

или, если вы хотите, в частности, США Английский:

MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) 

Обратите внимание, что это не сработает, если сообщение на указанном языке нет. Поэтому вы можете обращаться с ERROR_RESOURCE_LANG_NOT_FOUND и попробуйте позвонить ему с dwLanguageId=0.

Для получения дополнительной информации, see MSDN.

+1

Как я уже говорил, это не мой код, а Boost.System, который вызывает 'FormatMessage'. –

+0

Ну, тогда напишите свою собственную функцию. Это не сложно. –

+0

Patching Boost - это вариант, но я бы предпочел более чистое решение. На самом деле возникает вопрос, можно ли переопределить (LANG_NEUTRAL, SUBLANG_DEFAULT), то есть «Язык по умолчанию пользователя» (http://msdn.microsoft.com/en-us/library/windows/desktop/dd373908(v=vs.85) .aspx). Не следует ли влиять на локализацию или глобальную локаль? –

3

Был поиск по всему Интернету для решения, и, наконец, найдено this. В принципе, вы должны позвонить SetThreadUILanguage в ваш main/WinMain.