MessageBox(hWnd, "Hello World!", "API", MB_OK);Visual Studio 2005 - Visual C++에서 위 문장을 입력을 하면, 아래와 같은 컴파일 에러 메시지가 발생한다.
error C2664: 'MessageBoxW' : 매개 변수 2을(를) 'const char [18]'에서 'LPCWSTR'(으)로 변환할 수 없습니다. 가리킨 형식이 관련이 없습니다. 변환하려면 reinterpret_cast, C 스타일 캐스트 또는 함수 스타일 캐스트가 필요합니다.
무슨 말인가 하여 MSDN에서 MessageBox()의 원형을 찾아보았다.
int MessageBox(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
);
내가 입력한 문자열이 LPCTSTR 타입으로 케스팅이 안되나보다.
LPCTSTR에 대해서도 한 번 찾아보았다.
An LPCWSTR if UNICODE is defined, an LPCSTR otherwise.
This type is declared in WinNT.h as follows:#ifdef UNICODE
typedef LPCWSTR LPCTSTR;
#else
typedef LPCSTR LPCTSTR;
#endif
대충 해석해보자면 유니코드 체계에서는 LPCWSTR을 LPCTSTR로 사용한다는 말인데,
LPCWSTR은 LPCSTR 로 정의되었다나..
그래서 LPCSTR을 다시 찾아보았다.
Pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters.
For more information, see Character Sets Used By Fonts.
This type is declared in WinNT.h as follows:typedef __nullterminated CONST CHAR *LPCSTR;
눈치로 잡아도 char*타입인거 같은데 왜 안되는걸까...
결국엔 에러번호(error C2664)를 가지고 지식인에게 물어서 답을 얻을 수 있었다.... -.-;
Character Set 이 vc 6.0이나 2003에서는 Use Multi-Byte Character Set인데,
2005에서는 Use Unicode Character Set이라 발생하는 문제라고 한다. 그래서
프로젝트 -> 속성 -> 구성속성 -> 프로젝트 기본값(문자 집합)
에서 해당 값을 유니코드 문자 집합 사용에서 멀티바이트 문자 집합 사용으로 체크해 주면 된다.
끝.



2009/03/20 12:20
MessageBox(hWnd, "Hello World!", "API", MB_OK);
대신에
MessageBox(hWnd, TEXT("Hello World!"), TEXT("API"), MB_OK);
라고 해주는 방법.
TEXT("") 혹은 _T("") 정도의 매크로가 (아마) tchar.h에 정의되어 있어.
내가 알기로 gcc에도 tchar.h가 포함되어 있고 거기엔 TEXT("")만 정의되어 있을거야.
tchar.h가 뭐하는거인지는 직접 찾아보도록 하게나. ㅎㅎ
뭐.. char 만 쓰다가 TCHAR 쓰려면 삽질이 좀 필요할지도 모르지만..