천객만래 [千客萬來] (It has an interminable succession of visitors)

'USES_CONVERSION'에 해당되는 글 2건

  1. 2011.08.01 [개발/MFC] Variant To CString , CString to Variant
  2. 2011.03.19 [개발/MFC] 스트링 형변환
소백촌닭
이제 문자열 변환 헤매이지 말고 여기에서 다 찾자.
이 문자열 변수 변환은 아주 유용하게 사용될 것이당.

[개발/MFC] BSTR to CString 문자열 변환 http://sbrich.tistory.com/1047
[개발/MFC} CString to char  http://sbrich.tistory.com/842
[VC++] 문자열변환 CString LPSTR WCHAR* LPCWSTR  http://sbrich.tistory.com/383

Variant To CString , CString to Variant


CString str="abc";
COleVariant strVar(str);
VARIANT var=strVar.Detach();

 
CString VariantToString(VARIANT * va)
   {
    CString s;
    switch(va->vt)
      { /* vt */
       case VT_BSTR:
          return CString(vaData->bstrVal);
       case VT_BSTR | VT_BYREF:
          return CString(*vaData->pbstrVal);
       case VT_I4:
          s.Format(_T("%d"), va->lVal);
          return s;
       case VT_I4 | VT_BYREF:
          s.Format(_T("%d"), *va->plVal);
       case VT_R8:
          s.Format(_T("%f"), va->dblVal);
          return s;
       ... remaining cases left as an Exercise For The Reader
       default:
          ASSERT(FALSE); // unknown VARIANT type (this ASSERT is optional)
          return CString("");
      } /* vt */
   }

Posted by SB패밀리


문자관련 함수

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
Posted by SB패밀리