2013-07-04 4 views
7

현지화 된 UI가있는 Win7에서 error_code::message()은 영어 이외의 메시지를 반환합니다. 지금까지 내가 (system_error_category를 들어, 부스트 1.54에서) 보는 바와 같이, 위의 함수는 다음 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

앞에서 언급 한 것처럼 내 코드는 아니지만 'FormatMessage'를 호출하는 Boost.System입니다. –

+0

그럼, 직접 함수를 작성하십시오. 그것은 어렵지 않습니다. –

+0

패치 부스트는 옵션이지만 더 깨끗한 솔루션을 선호합니다. 실제로 문제는 "LANG_NEUTRAL, SUBLANG_DEFAULT"즉 "사용자 기본 언어"(http://msdn.microsoft.com/en-us/library/windows/desktop/dd373908(v=vs.85))를 재정의 할 수 있는지 여부입니다.) .aspx). 로케일이나 전역 로케일이 스레드에 영향을 미치지 않아야합니까? –

3

인터넷을 통해 해결책을 찾았으며 결국 this을 발견했습니다. 기본적으로 main/WinMainSetThreadUILanguage으로 전화해야합니다.

관련 문제