2010-07-23 1 views
5

wchar_t *BSTR으로 변환하려고합니다.C++ : wchar_t *를 BSTR로 변환 하시겠습니까?

#include <iostream> 
#include <atlstr.h> 

using namespace std; 

int main() 
{ 
    wchar_t* pwsz = L"foo"; 

    BSTR bstr(pwsz); 

    cout << SysStringLen(bstr) << endl; 

    getchar(); 
} 

이것은 내가 기대했던 것보다 작은, 0를 인쇄합니다. 이 변환을 수행하는 올바른 방법은 무엇입니까?

답변

9

SysAllocString (및 SysFreeString)을 사용해야합니다.

BSTR bstr = SysAllocString(pwsz); 

// ... 

SysFreeString(bstr); 

BSTR은 길이가 접두사 인 문자열의 문자로 관리되는 문자열입니다. SysAllocString은 정확한 저장 공간을 할당하고 문자열의 길이와 내용을 올바르게 설정합니다. BSTR이 올바르게 초기화 된 경우 SysStringLen이 올바른 길이를 반환해야합니다.

C++을 사용하는 경우 SysFreeString 호출을 잊지 않도록 RAII 스타일 클래스 (또는 Microsoft의 _bstr_t)를 사용하는 것이 좋습니다. 내가 가장 쉬운 생각

1

중 하나

CString

또는

CComBSTR

모두

는 찰스

+1

'CString' ('.AllocSysString()')에서'BSTR'을 할당하는 방법이 있지만'CString'은'BSTR'을 감싸지 않습니다. 그러나'CString'은 자동적으로'BSTR'을 해제하는 데 도움이되지 않습니다. –

+0

의미에서 그것은 OP가 원했던 BSTR로 변환 할 수있는 기능을 포함하고 있지만 기술적으로는 올바른 단어의 선택이 맞지 않습니다. –

2

SysStringLen()는 할당 된 BSTR에 사용해야합니다 언급 무슨 방법을 사용하는 것입니다 SysAllocString() 가족 기능에 의해. 그렇게하면 정의되지 않은 동작이 발생할 수 있습니다. 프로그램이 중단되거나 예기치 않은 결과가 발생할 수 있습니다. 더 나은 아직 래퍼 클래스 - ATL::CComBSTR 또는 _bstr_t을 사용하십시오.

관련 문제