[개발/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) |
'IT-개발,DB' 카테고리의 다른 글
[개발/웹] Post, Get 데이터 보내기 유의사항 (0) | 2012.01.13 |
---|---|
[개발/C++] 작업표시줄 정보 및 작업영역 구하기 (0) | 2012.01.13 |
[개발/MFC] error LNK2005: --- .obj에 이미 정의되어 있습니다. 오류 (0) | 2012.01.05 |
[개발/C++] 형 변환 char* to string or string to char* (0) | 2012.01.03 |
[개발/C++] 문자열 치환/변환 (0) | 2012.01.03 |
댓글