필자에게 몇일전 MAX SDK 8 으로 제작된 플러그인을 MAX SDK 2013에 맞게 수정을 해야 되는 작업이 들어왔습니다.
SDK 버전업이 되면서 클래스라던지 함수라던지 구조가 바뀌는건 해당 레퍼런스 찾아서 수정하면 간단하게 해결이 되는건데 가장 큰문제는
Unicode - 3ds Max now compiles with Unicode.
이 한줄 이였습니다.
기존의 우리 프로젝트가 멀티바이트를 기반으로하여 만들어져 있는데다 MAX SDK 8 로 제작했었던 플러그인도 멀티바이트를 기반으로 만들어져 있어
문자 집합을 멀티바이트에서 유니코드로 변경을 해야 되는 상황이 생겼습니다.
프로젝트 설정에서 멀티바이트 -> 유니코드로 변경하고 빌드를 돌리는 순간 엄청난 양의 컴파일 에러들....
기존 소스중 char 형으로 되어있는 소스들을 모두 TCHAR 혹은 wchar_t 형으로 변경해야 되나 고심을 하다가 알게된
USES_CONVERSION 이라는 매크로.
간단히 설명하자면 UNICODE <-> MBCS(MultiBtyeCharacterSet) 로 바꿔주는 문자열 변환 매크로 입니다.
사용 방법은 #include <atlconv.h> 와 같이 atlconv.h 파일을 인클루드 해주고
변환하고자 하는 문자열이 포함된 함수내에서 상단에 USES_CONVERSION 매크로를 정의한후 바꾸고자 하는 문자열에 맞춰 아래 처럼 캐스팅하면 됩니다.
ex) 사용방법
USES_CONVERSION;
wchar_t* widechar = L"unicode";
char* ansichar;
ansichar= W2A(widechar);
// 제공하는 변환 매크로들
A2CW (LPCSTR) -> (LPCWSTR)
A2W (LPCSTR) -> (LPWSTR)
W2CA (LPCWSTR) -> (LPCSTR)
W2A (LPCWSTR) -> (LPSTR)
T2COLE (LPCTSTR) -> (LPCOLESTR)
T2OLE (LPCTSTR) -> (LPOLESTR)
OLE2CT (LPCOLESTR) -> (LPCTSTR)
※ 사용시 유의 사항!!
USES_CONVERSION 매크로는 내부적으로 매크로가 호출된 시점에서 변환될 문자열의 길이값만큼 동적메모리를 할당후 변환된 문자열을 리턴해줍니다.
함수가 끝나는 시점에서는 할당했던 동적메모리를 해제하기때문에 리턴하기전에 캐스팅을 하면 쓰레기값밖에 리턴이 되지 않습니다.
ex) 잘못된 예
wchar_t * GetCharConversion( char* _szInput )
{
USES_CONVERSION;
return A2W( szInput);
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ps. TCHAR에 대한 부가 설명.
TCHAR는 말그대로 char형을 typedef로 재정의한 데이터유형 입니다.
프로젝트 설정에서 문자집합을 유니코드로 변경하면 전처리기에 UNICODE 와 _UNICODE가 추가되는 것을 볼수있을 것 입니다.
TCHAR를 추적하여 tchar.h 파일을 살펴 보면
#ifdef UNICODE라면 typedef wchar_t TCHAR
#ifdef _MBCS 라면 typedef char TCHAR
와 같은 소스를 볼수 있을것입니다.
프로젝트에 설정에 따라서 TCHAR형은 컴파일단계에서 char형이 될수도 wchar_t 형이 될수도 있는 것 입니다.
국내에서만 사용하는 프로그램이라면 굳이 위와같이 문자열 타입을 신경쓰지 않아도 되지만
혹여 다른 여러국가에 사용하게 될 프로그램이라면 프로젝트 설정에서 꼭 유니코드 기반으로 설정하고 프로젝트를 시작하길 권합니다...
간단하게 설명하자면 MBCS로 모든 나라의 언어를 표현할수 없기때문이고 자세한 정보는 MBCS 때문에 개고생을 하고나면 자연스레 알게 되시리라 봅니다 ㅋ
'프로그래밍 > c++' 카테고리의 다른 글
VFT(Virtual Function Table) (0) | 2013.07.23 |
---|---|
RTTI(Run-Time Type Information) (0) | 2013.07.23 |
c++ 천단위마다 콤마(,) 찍기 (0) | 2013.06.18 |
디버깅시 유용한 파일 이름, 라인 넘버, 함수이름 남기기 (0) | 2013.05.29 |
rand() 함수의 문제점을 극복한 알고리즘 (0) | 2013.04.29 |