CString – > char* 로…케스팅
CString strPP;
char * chNN = (LPSTR)(LPCSTR)strPP;
이렇게 해서 chNN을 CString의 포인터로 가져 옵니다.
(LPSTR)(LPCSTR)strPP 이 부분 에서 이유는 MSDN을 찾아보시면 아시겠지만 CString은 const char * 으로 만 받을수 있답니다.
그래서 (LPCTSTR)strPP 이런 형식으로도 사용합니다. 물론 const char *으로 return되겠죠.. 다시 char *을 필요하신다면
char * chNN = (char *)(LPCTSTR)strPP;
이런 식으로도 사용합니다.
===>(LPSTR)(LPCTSTR)str은 위험한듯..
1) 유니코드를 고려하지 않았을뿐 아니라
2) 위험하게 내부데이터를 접근합니다.
char *pstr = (LPSTR)(LPCTSTR)str;
이 줄은 UNICODE인경우..
char *pstr = (char *) (const wchar_t *) str;
입니다.
특히 wchar_t를 본래데이터형으로 보지 않을 경우
char *pstr = (char *)(const unsigned short *)str;
입니다..
뭐 일단 유니코드를 고려하지 않는다고 하더라도, CString이 제공하는 것은 const 가 붙은 형변환 밖에 없는데,
이걸 const 를 억지로 빼버리고는 마치 접근해서 고쳐도 되는 것처럼 보이게 되므로 .. 잘못사용하면 오류를 일으키며. 프로그램이 뻑.. 뻗을수도 있쬬 ^^ (const 변환은 받는 쪽에서 안고친다고 보고 CString이 자기 내부 데이터 주소를 살짝 보여주는 건데.. 그걸 char로 바꾸고 쓰려고 하면.. -.-;)
보통 이런 문제는 char[50] 에서 처럼 .. 특정 위치의 글자를 바로 접근할 수 있냐..란 의문에서 생기는데 이 문제는 CString만으로도 충분합니다. CString이 operator[] 를 제공하므로..
str[23] 이렇게 마치 char[] 처럼 사용하실수 있습니다. 물론 이때도 길이를 넘어서는 접근은 피해야 겠죠.. C/C++의 배열이 제공못하는 길이를 CString읜 GetLength()형태로 제공하니 얼마나 편합니까 ^^;;;
그래도 기존 라이브러리(void f(char *)가 있어서 변환이 필요하다면.. 추천하는 방법은
1) char data[50]; strcpy(data, str); f(data); ///////// 유니코드에선 TCHAR data[50]; _tcscpy(data, str)
2) f(str.GetBuffer(50)); str.ReleaseBuffer();
CString => char* 변환
char * ch;
CString *str;
1) ch = (LPSTR)(LPCSTR)str;
2) ch = str.GetBuffer(str.GetLength());
3) wsprintf( ch, “%s”, str);
char* => CString 변환
1) str = (LPCSTR)(LPSTR)ch;
2) str = ch;
참고)
LPSTR 은 char* 입니다.
LPSTR : char stirng의 32비트 포인터, char* 와 같다.
LPCTSTR : Constant character String의 32비트 포인터
UINT : 32비트 unsigned형 정수
DWORD : unsigned long int형
BYTE : 8비트 unsigned 정수
참고 : CString을 const char* 형태로 변경 -> (LPTSTR)(LPCTSTR)CString