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

[VC++] C++ 모든 자료형 정리( 문자열 )

by SB리치퍼슨 2010. 9. 30.

LPSTR : char *

LPCSTR : const char *

LPCTSTR : const char * 또는 const WCHAR *



WORD : 보통 2바이트의 부호없는 정수형   (*.word형을 string형으로 바꾸기 string := IntToStr(word); )

DWORD : 4바이트의 부호없는 정수형    DWORD unsigned long

그럼, WORD와, int의 차이점은...

WORD는 4글자 int는 3글자
typedef unsigned short         WORD;    //WORD는 예약어가 아니죠  (typedef는 변수부분)

                                                                                               (cf.define은 전처리 부분)


*.단순참고

char, unsigned char, signed char : 1 byte
short, unsigned short : 2 bytes
int, unsigned int : 4 bytes
long, unsigned long : 4 bytes
float : 4 bytes
double : 8 bytes
long double : 10 bytes

=================================================================================



1. C 자료형
   char(1), short(2), int(4), long(4), float(4), double(8), bool
   문자: char



 
2. Win32 API 자료형
   BYTE(1, unsigned char), WORD(2, unsigned short), UINT(4, unsigned int)
   DWORD(4, unsigned long), LONG(4,long), BOOL
   문자: UCHAR(unsigned char)
   Handle: 대상을 구분하는 4바이트 정수(HWND,HDC...)
  
   MBCS문자(열)  유니코드문자(열)  자동매크로문자(열)
   ------------         -----------------        ------------------
   char   wchar_t    TCHAR
   LPSTR(char*)         LPWSTR(wchar_t*)         LPTSTR
   LPCSTR(const char*)  LPCWSTR(const wchar_t *) LPCTSTR
 
   .LPTSTR과 LPCTSTR를 사용하는 것이 좋음.
   .OLECHAR(wchar_t), LPOLESTR(LPWSTR), LPCOLESTR(LPCWSTR), OLESTR(x) = _T(x)




3. COM 스트링
   BSTR : 문자열 길이를 시작전에 저장하고, 이어서 유티코드문자열을 저장하는 방식
   LPCWSTR -> BSTR : 생성안됨. 생성함수를 이용해야 함.
                     BSTR bstr = sysAllocString(L"HELLO HI"); // 메모리 할당
                                 sysFreeString(bstr);         // 메모리 제거



   VARIANT: 문자열이 들어올때 BSTR과 동일

VARIANT 자료형은 각 개발 환경의 자료형의 차이를 해결하기위하여 제공되는 공용체 이다.


예제) INT nIndex 와 CString strItem이 있다고 가정하고...


// VARIANT 형 선언

VARIANT varIndex, varItem;


// VARIANT type 지정
varIndex.vt = VT_INT;
varItem.vt = VT_BSTR;


// VARIANT 값 할당.
varIndex.intVal = nIndex;
varItem.bstrVal = strItem.AllocSysString();// CString을 bstr로 변환하는 함수


// VARIANT 인자를 사용하여 함수 호출




 

4. CRT(c runtime library)지원 스트링 클래스 (#include "comdef.h")
   4-1. _bstr_t
        :BSTR 랩퍼 클래스, 메모리 할당/제거를 자동으로 수행
      
        . LPCSTR, LPCWSTR  -> _bstr_t
          :_bstr bstr = "hello hi";
        . _bstr_t -> LPCSTR, LPCWSTR
          : LPCSTR psz1 = (LPCSTR)bs1;
        . _bstr_t -> BSTR
          : 형변환 안됨. 함수이용
            BSTR bstr = bs1.copy();
            sysFreeString(bstr); // BSTR은 사용후 메모리 해제를 해야함.

   4-2. _variant_t
        :VARIANT 랩퍼 클래스, 메모리 할당/제거 자동 수행
       
        . LPCSTR, LPCWSTR -> _variant_t
          : _variant_t v1 = "hello hi";
        . _variant_t -> _bstr_t -> LPCSTR,LPCWSTR
          : LPCSTR psz1 = (LPCSTR)(_bstr_t)v1;




5. ATL 지원 스트링클래스
   5-1 CComBSTR : BSTR랩퍼클래스, 메모리할당/제거 자동 수행
      . LPCSTR, LPCWSTR -> CComBSTR
        CComBSTR bs1 = "hello hi";
      . CComBSTR -> BSTR -> LPCWSTR
        BSTR bs = (BSTR)bs1;
      . BSTR -> CComBSTR
        CComBSTR bs2; bs2.Attach(W2BSTR(L"hello hi");

   5-2 CComVariant: VARIANT랩퍼클래스, 메모리할당/제거 자동 수행
      . LPCSTR, LPCWSTR -> CComVariant
        CComVariant bs1 = "hello hi";
      . CComVariant -> CComBSTR -> BSTR -> LPCWSTR
        CComBSTR bs = bs1.bstrVal;



6. STL 스트링
   6-1 string
       . LPCSTR -> string
         string str = "hello hi";
       . string -> LPCSTR (형변환 안됨. 함수 이용)
         LPCSTR psz = str.c_str();
   6-2 wstring
       . LPCWSTR -> wstring
         wstring str = "hello hi";
       . wstring -> LPCWSTR
         LPCWSTR psz = str.c_str();



7. MFC 스트링
   . LPCSTR, LPCWSTR -> CString
     CString str = "hello hi";
   . CString -> LPCTSTR
     1. LPCTSTR lpsz = (LPCTSTR)str;
     2. LPTSTR lptsz = str.getBuffer(0), str.ReleaseBuffer(); (올바른 사용)
     3. LPTSTR lptsz = (LPTSTR)(LPCTSTR)str; (잘못된 표현)
     4. CString -> BSTR
        BSTR bstr = str.AllocSysString(); sysFreeString(bstr);



8. VC7 스트링
   String: .Net에서 새로 정의한 스트링 클래스
          String* s1 = S"hello hi";
          CString s2(s1);
    

9. ETC

   1. BSTR --> LPCSTR
      USES_CONVERSION;
      LPCSTR lpaszTemp = OLE2CA(bstrValue);

   2. LPCSTR --> BSTR
      USES_CONVERSION;
      BSTR bstrTemp = ::SysAllocString(A2COLE(lpaszValue));

   3. CString --> LPCSTR
      1) ANSI 버전
          LPCSTR lpaszTemp = (LPCSTR) strValue;
      2) UNICODE 버전
          USES_CONVERSION;
          LPCSTR lpaszTemp = T2CA((LPCTSTR) strValue);

   4. LPCSTR --> CString
      1) ANSI 버전
         CString strTemp = lpaszValue;
      2) UNICODE 버전
          USES_CONVERSION;
          CString strTemp = A2CT(lpaszValue);

반응형

댓글