CString – > char* 로…케스팅

June 27, 2006 at 7:37 am (Visual C++)

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

Post a Comment