본문 바로가기
IT-개발,DB

[개발/MFC] 스트링 형변환

by SB리치퍼슨 2011. 3. 19.


문자관련 함수

MBCS(multi-byte character set) : ASCII 코드 문자열을 쓰는 함수
WCS(wide character string) : 유니코드 문자열을 쓰는 함수

함수 제일 뒤에 ASCII를 나타내는 A와 Wide Character를 나타내는 W를 붙여서 구분함.
예)  GetCurrentDirectoryA ...
예외) cout, wcout

LPCTSTR(Long Pointer Constant TCHAR String)
여기서 TCHAR 라는 것은 typedef  유니코드가 설정되어 있으면 2바이트로(wchar_t) 아니면 기존 char 방식인 1바이트로(char) 한다는 것을 의미.

LPSTR : 8비트 윈도우 캐릭터 스트링(string) 포인터 문자.
LPCSTR : LPSTR 와 같고 단지 상수형(Constant )이라는 포인터문자.

참조:
http://cafe.naver.com/whatvoip.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=225


--> MFC의 CString 은 TCHAR 형이다.

ATL 형변환 메크로

종류는 [소스 타입]2[새로운 타입][소스 타입]2C[새로운 타입] 이 있다.
여기서 2C의 C는 const형(읽기전용)이라는 뜻이다.

ATL 3.0 String Conversion Macros

A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T



여기서 A, W, T, OLE, BSTR이 있는데 그 의미는 다음과 같다.

A : MBCS 스트링, char* (A 는 ANSI를 의미) -> LPSTR
W : Unicode 스트링, wchar_t* (W는 wide를 의미) -> LPWSTR
T : TCHAR 스트링, TCHAR* -> LPTSTR
OLE : OLECHAR 스트링, OLECHAR* (사실, W와 같은 의미) -> LPOLESTR
BSTR : BSTR

이를 통해 몇가지 메크로를 분석해 보면

매크로 인자 결과
A2CW (LPCSTR) (LPCWSTR)
A2W (LPCSTR) (LPWSTR)
W2CA (LPCWSTR) (LPCSTR)
W2A (LPCWSTR) (LPSTR)
T2COLE (LPCTSTR) (LPCOLESTR)
T2OLE (LPCTSTR) (LPOLESTR)
OLE2CT (LPCOLESTR) (LPCTSTR)
OLE2T (LPCOLESTR) (LPCSTR)



*사용법:
#include <atlconv.h>
void func( LPSTR lpsz )
{
   USES_CONVERSION; //형변환 메크로를 사용하기 위해서.
   ...
   LPWSTR x = A2W(lpsz)
   // Do something with x
   ...
}

*사용시 주의점:
이 매크로는 메모리를 스택에 잡음:
1) 과도한 순환문 속에서는 사용하면 안됨.
   - 매크로가 불릴 때마다 스택의 메모리를 잡아먹습니다.
   - 그 메모리는 함수가 끝날 때까지 해제되지 않습니다.
2) 매크로의 결과를 리턴하면 안됨.
   - 결과로 나오는 포인터는 함수가 끝날 때까지만 유효합니다.

참조 :
http://msdn.microsoft.com/en-us/library/87zae4a3(VS.80).aspx
http://jof4002.net/?Unicode
http://eroom.korea.com/post/board.aspx?bid=kmh_19505&mode=read&view=board&pid=189103&page=1


LPWSTR to CString

(CString) 으로 캐스팅하면 끝


CString to LPWSTR

CString strString = "abcd";
BSTR bstrString = strString.AllocSysString();
LPWSTR pwstr = (LPWSTR)bstrString;
SysFreeString(bstrString);

CString to LPTSTR

CString str = _T("new text");

  LVITEM item = {0};
 
  item.mask = LVIF_TEXT;
  item.iItem = 1;
  item.pszText = (LPTSTR)(LPCTSTR) str; // 잘못된 사용!
  // 올바른 사용.
  /*1)*/ item.pszText = str.GetBuffer();
  // 또는
  /*2)*/ _tcscpy_s(item.pszText, MAX_PATH, str.GetBuffer(str.GetLength()));
  ListView_SetItem ( &item );
  str.ReleaseBuffer();

참조 :
http://eroom.korea.com/post/board.aspx?bid=kmh_19505&mode=read&view=board&pid=189103&page=1

CString to DWORD

CString str=_T("abcd");
DWORD dw = (DWORD)_ttoi((LPCTSTR)str);


출처 : http://hogwarts.tistory.com/172
반응형

댓글