관리 메뉴

드럼치는 프로그래머

[API/MFC] BSTR 본문

★─Programing/☆─API | MFC

[API/MFC] BSTR

드럼치는한동이 2011. 4. 18. 18:43

BSTR을 자동화 타입에 사용되는 문자열의 자료형으로써 COM세계에서 문자열은 유니코드로 표현하도록 되어 있다.

<<BSTR의 형식>>

12 H E L L O  W O R L D \0  -->제일 앞 4 byte는 문자열의 길이가 입력됨

CString의 AllocSysString멤버함수를 사용하면 CString형을 BSTR로 변환

반대로는 LPCWSTR변환 연산자 사용 하면 됨

ex) CString yunju =(LPCWSTR) bstr;

 

BSTR을 만들고 COM 개체 간에 전달할 때는 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반환하는 함수를 구현할 때는 문자열을 할당만 하고 해제하지는 않음. 해당 함수를 받는 개체에서 메모리를 해제함
    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 );
    }
    //

[출처] http://blog.naver.com/yiyunju?Redirect=Log&logNo=150038857115
Comments