퍼온곳 : http://hogwarts.tistory.com/tag/LPWSTR%20to%20CString
문자관련 함수
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 to LPWSTR
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
DWORD dw = (DWORD)_ttoi((LPCTSTR)str);
'프로그래밍 > 공부관련' 카테고리의 다른 글
Windows :: 정적 라이브러리 만들기 (0) | 2010.05.18 |
---|---|
sscanf (0) | 2010.05.18 |
CString -> LPTSTR (0) | 2010.05.09 |
ShellExecute Function (1) | 2010.05.09 |
Direct X - Direct Input (0) | 2010.05.08 |