2010-02-22 3 views
2

나는 책을 읽으며 빈 WIN32 프로젝트를 열어달라고 말했습니다. main.cpp라는 소스 파일을 생성하여 소스 폴더에 저장했습니다 (이것은 프로젝트에있는 유일한 파일입니다). 이 파일에 다음 코드를 입력하십시오 :: 오류 C2664 : 'MessageBoxW': 'const char [40]'에서 매개 변수 2를 변환 할 수 없습니다.

#include <windows.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
        LPSTR lpCmdLine, int nShowCmd) 
{ 
    MessageBox(NULL, "Motoko kusangai has hacked your system!", "Public Security Section 9", MB_OK | MB_ICONEXCLAMATION); 
} 

그리고 실행하십시오. 하지만 다음 오류가 발생합니다.

1>c:\users\numerical25\documents\visual studio 2008\projects\begin\begin\main.cpp(6) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [40]' to 'LPCWSTR' 
1>  Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
1>Build log was saved at "file://c:\Users\numerical25\Documents\Visual Studio 2008\Projects\Begin\Begin\Debug\BuildLog.htm" 
1>Begin - 1 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

내가 뭘 잘못하고 있니?

답변

7

당신은 당신이 유니 코드 용으로 컴파일되기 때문에이 경우에는 넓은 문자열을 사용합니다. Petzold에의 고전 프로그래밍 Windows 내가 읽기를 권하고 싶습니다 유니 코드에 큰 장으로 시작합니다 L.

MessageBox(
    NULL, 
    L"Motoko kusangai has hacked your system!", 
    L"Public Security Section 9", 
    MB_OK | MB_ICONEXCLAMATION); 
+0

오른쪽! 고마워. 그리고 프로그래밍에 대해 많은 것을 알고 있다고 생각했습니다. C++은 완전히 새로운 볼 게임입니다. 나는 유니 코드를 컴파일하는 것과 비공식이다. 이들이 무엇인지 설명하는 좋은 자원을 알고 있습니까? 그리고 왜 책 컴파일러는 그것을 필요로하지 않았고 내가 그랬다. 그들도 MSV를 사용하고 있습니다. 버전은 다르지만 인터페이스는 완전히 동일하게 보입니다. – numerical25

+0

하하, 나중에 신경 쓰지 마라. 나는 나중에 오류가 발생한다고 설명한다 : P. 나는 책이 그것을 할 때 나는 그것을 싫어한다. – numerical25

+0

그것은 L 또는 TCHAR을 사용한다고 말합니다. – numerical25

2

는() 태그는, 일부 정적 텍스트에 대해이 오류가 _T 내에서 정적 텍스트를 둘러싸

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
        LPSTR lpCmdLine, int nShowCmd) 
{ 
    MessageBox(NULL, _T("Motoko kusangai has hacked your system!"), _T("Public Security Section 9"), MB_OK | MB_ICONEXCLAMATION); 
} 

때마다 시도합니다.

편집 : MS Link

+0

이 경우 _T()가 작동하지 않았습니다. – numerical25

+0

오 .. 이상한, 잠시 동안 C + +를 사용하지 않았지만 그게 _T, L ""그때 일한 것 같아요 :) 회신을위한 건배 –

+1

32 비트 컴파일 들어, 맞을거야. 64 비트의 경우, MS는 _UNICODE를 정의하지 않고 와이드 문자열을 기본값으로 만들었는데, 이는 '_T'와 'TEXT'가 (이러한 상황에서) 작동하지 않는다는 것을 의미합니다. –

4

와 문자열 상수의 모든 접두어보십시오. 어떤 Win32 UI 작업을 할 예정이라면 그의 책을 얻을 수있을 것입니다. 요즘에는 Win32가 얼마나 좋았는지 감안할 때 가장 최근의 5th 에디션의 사용 된 복사본을 20 달러 미만으로 수령 할 수 있습니다. 대부분의 기술 저자 들과는 달리 찰스는 매우 대화식 스타일을 가지고 있으며, 길이에 관계없이 그의 책을 매우 가독성있게 만드는 강력한 스토리 텔링 기술을 사용합니다 (C#을 사용한 프로그래밍 윈도우도 비슷하게 좋았습니다).

그것은 유니 코드 문자열을 사용하는 요즘 좋은 방법입니다하지만 당신이 정말로 그들을 원하지 않는 경우, 당신은 VS에서 프로젝트 속성로 가서 "를 사용하여 멀티 바이트 문자가 설정"문자 세트를 변경할 수 있습니다, 그것은 본질적으로 당신에게 익숙한 보통 8 비트 ASCII를 얻을 것입니다.

0

비슷한 오류가 발생하여 "다중 바이트 문자 집합 사용"으로 변경하면 효과적입니다. Visual Studio 2012를 사용하고 있습니다.

관련 문제