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

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

by SB리치퍼슨 2012. 1. 7.

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

 

문자관련 함수

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

 

 

여기서 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

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

 

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

 

*사용법:

#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

 

 

매크로

인자

결과

A2CW

(LPCSTR)

(LPCWSTR)

A2W

(LPCSTR)

(LPWSTR)

W2CA

(LPCWSTR)

(LPCSTR)

W2A

(LPCWSTR)

(LPSTR)

T2COLE

(LPCTSTR)

(LPCOLESTR)

 

반응형

댓글