2016-08-02 8 views
3

정직한 하나님, 나는 지금 내 마음을 잃고 있습니다. 먼저 "MessageBox"함수가 CodeBlocks 내부에서 텍스트를 정의 할 때 완벽하게 올바르게 작동한다고 말하면서 시작하겠습니다. 어떤 이유로 든 Visual Studio는이 MessageBox 함수의 내부에 무엇이 들어갈 수 있는지에 대해 까다 롭습니다.내 메시지 상자가 다른 언어로 나타나는 이유는 무엇입니까?

내가 그 안에 넣은 것이 LPCWSTR "물건"에 대해 유효하지 않다고 계속 말했습니다. 이 문제를 회피하기 위해, 나는 아래이 일 프로그램 :

Image

이것은 매우 스트레스 : 그것은 내가 원래 생각했던 방법을 작동하는 대신

int main() 
{ 
LPCWSTR a; 
std::string s = "Please help me."; 
a = (LPCWSTR)s.c_str(); 

LPCWSTR b; 
std::string t = "MTS"; 
b = (LPCWSTR)t.c_str(); 

    MessageBox(0,a,b, MB_OK | MB_ICONSTOP); 
} 

를 내가 대신의 결과이있어 저와 저는 그것이 이전에 한 번 물었습니다. 따라서 제 질문을 중복으로 표시하지 마십시오. 내 메시지가 영어로 표시되고 내가 분명히 말하고자하는 것을 묘사하도록이 코드가 작동하도록하려면 어떻게해야합니까? 미리

감사합니다,

MTS

+0

'MessageBox'는'LPCTSTR' 인수를 취하지 만'LPCWSTR'을 제공하고 있습니다. 'LPCTSTR' 대신에'a'와'b'를 선언/캐스팅 해보십시오. – Doc

+0

@Doc a) MessageBox가 MessageBoxA가되거나 MessageBoxW가 프로젝트 설정/전 처리기 항목에 의존하는 경우. b) 주조가 도움이되지 않습니다. c) japanese 결과물은 W 변형입니다. – deviantfan

답변

7

가 다른 언어로 표시됩니다 (일반적으로, 당신이보고있는 언어로 횡설수설이다) 이유는 당신이 문자열을 캐스팅하고 있다는 것입니다 대신 적절한 문자열 형식을 사용하는 입력 :

이 코드가하는
LPCWSTR b; 
std::string t = "MTS"; 
b = (LPCWSTR)t.c_str(); 

하지 넓은 문자열로 좁은, ANSI 기반의 문자열을 설정합니다. 변환은 이 아니며 변환 문자열 유형입니다. 캐스트를 제거하면 컴파일러에서 문자열 유형/포인터가 일치하지 않는다는 오류를 표시합니다.

MessageBox 함수를 사용하고 있기 때문에 실제로는 넓은 문자열 인수가 필요한 MessageBoxW을 호출합니다.

MessageBoxW를 호출 할 이유 귀하의 경우 그 이유는 MessageBox 중 하나를 빌드 유형 (MBCS 또는 Unicode, 각각)에 따라 MessageBoxA 또는 MessageBoxW을 할 것입니다. CodeBlocks의 경우 프로젝트를 MBCS으로 설정하고 Visual Studio에서는 Unicode으로 설정하여 하나의 프로젝트에서 작동하고 다른 프로젝트에서는 실패합니다.

LPCWSTR b; 
std::wstring t = L"MTS"; 
b = t.c_str(); 

또는이 :

LPCWSTR b; 
std::basic_string<WCHAR> t = L"MTS"; 
b = t.c_str(); 

둘 다 MBCSUnicode에 대해 동일한 코드가 작동을하려면 빌드

따라서 수정이 경우 넓은 문자열을 제공하는 것입니다 코딩 변경없이, 다음을 사용할 수도있다 :

이 코드는 _T (또는 TEXT 매크로)을 사용하여 빌드 유형에 따라 문자열 리터럴을 좁게 또는 넓게 만듭니다. TCHAR은 빌드 유형에 따라 폭이 좁거나 넓습니다.당신이 문자열을 필요로하는 함수를 호출하는 경우, 컴파일러는 당신에게 문자열 유형, 하지 시도 C 스타일의 캐스팅을 일치하지 않는 오류를 제공합니다 -


결론은 이것이다 컴파일러 오류를 "수정"합니다. 이것은 특히 문자열의 경우입니다. 그 캐스팅이 필요 절대 노출되지 않도록하는 대신, 하나

1),

또는

2

)로하지 않고 문자열 유형을 받아이 경우 MessageBoxA)에서 올바른 기능 (전화를 올바른 문자열 유형을 제공합니다 캐스트를 적용하십시오.

+0

고맙습니다. – MTS

관련 문제