프로그래밍/VC++

BSTR

panpro 2007. 3. 8. 13:17

BSTR : 문자열 길이를 시작전에 저장하고, 이어서 유티코드문자열을 저장하는 방식


LPCWSTR -> BSTR : 생성안됨. 생성함수를 이용해야 함.
                    BSTR bstr = sysAllocString(L"HELLO HI"); // 메모리 할당
                                sysFreeString(bstr);         // 메모리 제거

(*._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은 사용후 메모리 해제를 해야함.)



BSTR을 만들고 COM 개체 간에 전달할 때는 BSTR에서 사용하는 메모리 처리에 주의하여 메모리 누수를 방지해야 합니다. BSTR이 인터페이스 내부에 있을 경우 사용한 메모리는 반드시 해제해야 합니다. 그러나 BSTR 이 인터페이스 외부로 전달되는 경우에는 받는 개체에서 메모리를 관리합니다.


BSTR에 대해 메모리를 할당하고 할당된 메모리를 해제하는 일반적인 규칙은 다음과 같습니다.
BSTR 인수가 필요한 함수를 호출할 때는 호출하기 전에 BSTR에 대한 메모리를 할당한 후 나중에 해제합니다. 다음 코드에서는 이러한 예를 보여 줍니다.


HRESULT IWebBrowser2::put_StatusText( BSTR bstr );


// shows using the Win32 function
// to allocate memory for the string:
BSTR bstrStatus = ::SysAllocString( L"Some text" );
if (bstrStatus == NULL)
  return E_OUTOFMEMORY;


pBrowser->put_StatusText( bstrStatus );


// Free the string:
::SysFreeString( bstrStatus );
//...


BSTR을 반환하는 함수를 호출할 때는 문자열을 직접 해제해야 합니다. 다음 코드에서는 이러한 예를 보여 줍니다.


HRESULT IWebBrowser2::get_StatusText( BSTR FAR* pbstr );
//...


BSTR bstrStatus;
pBrowser->get_StatusText( &bstrStatus );


// shows using the Win32 function
// to freee the memory for the string:
::SysFreeString( bstrStatus );


BSTR을 반환하는 함수를 구현할 때는 문자열을 할당만 하고 해제하지는 않습니다. 해당 함수를 받는 개체에서 메모리를 해제합니다. 다음 코드에서는 이러한 예를 보여 줍니다.
// Example shows using MFC's
// CString::AllocSysString

//...
HRESULT CMyClass::get_StatusText( BSTR * pbstr )
{

  try
  {
     //m_str is a CString in your class
     *pbstr = m_str.AllocSysString( );
     }
  catch (...)
  {
     return E_OUTOFMEMORY;
  }


// The client is now responsible for freeing pbstr.
return( S_OK );
}


//...

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

1) BSTR.
유니코드 문자열은 BSTR이란 타입으로 표시.
유니코드 문자열은 ASCII 문자열과 달리 2바이트를 할당한다는 것이다. 현재 유니코드 표준은 24개 언어에서 나온 총 34,168개의 글자를 포함하고
있는 상태이다.
추가적으로 다른 몇몇 현대어를 포함하려는 작업이 진행 중이라고 한다.
윈도우 NT나 2000은 내부적으로 모든 문자 코드를 유니코드로 처리한다.
95나 98은 COM 관련 부분 등의 운영체제 일부분에서만 문자 코드를 유니코드로 처리한다
example)
// str은 CString 타입이다.
BSTR bstr = str.AllocSysString(); // 이렇게 만들어진 bstr은 SysFreeString API를 사용해서 제거해야
한다. 이고, 반대로의 변환은 다음과 같다.
CString str = bstr; // 이렇게 하고 나서 그냥 str을 사용하면 된다.
유니코드에서 ASCII 문자열로의 변환 방법은 다음과 같다.
example)
// newVal이란 BSTR 타입에 있는 유니코드 문자열을 sTime이라는 ANSI 문자열로 변환
char sTime[128];
WideCharToMultiByte(CP_ACP, 0, newVal, -1, sTime, 128, NULL, NULL);



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

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 인자를 사용하여 함수 호출