2010-07-23 18 views
5

Próbuję przekonwertować wchar_t * na BSTR.C++: Konwertuj wchar_t * na BSTR?

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

using namespace std; 

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

    BSTR bstr(pwsz); 

    cout << SysStringLen(bstr) << endl; 

    getchar(); 
} 

Drukuje 0, która jest mniejsza niż to, co miałem nadzieję. Jaki jest prawidłowy sposób na tę konwersję?

Odpowiedz

9

Musisz użyć SysAllocString (a następnie SysFreeString).

BSTR bstr = SysAllocString(pwsz); 

// ... 

SysFreeString(bstr); 

BSTR to udało ciąg znaków z łańcucha ustalonej przez ich długości. SysAllocString przydziela prawidłową ilość pamięci i poprawnie ustawia długość i zawartość ciągu. Po prawidłowym zainicjowaniu BSTR, powinien zwrócić prawidłową długość.

Jeśli używasz C++, możesz rozważyć użycie klasy stylu RAII (lub nawet wersji _bstr_t firmy Microsoft), aby upewnić się, że nie zapomnisz o połączeniach SysFreeString.

1

myślę najłatwiej jest albo użyć

CString

lub

CComBSTR

oba mają metody, które wykonują co Charles wspomniano

+1

'CString' nie _wrap_ a' BSTR', chociaż ma metodę przydzielenia 'BSTR'a z' CString' ('.AllocSysString()'). 'CString' nie pomaga jednak w automatycznym zwalnianiu' BSTR'. –

+0

również w pewnym sensie zawija funkcjonalność do konwersji na BSTR, który był tym, co OP chciał, ale technicznie masz rację, więc mój wybór słów nie był właściwy. –

2

SysStringLen() powinny być używane tylko na BSTRs przydzielonych przez SysAllocString() funkcje rodziny. Używanie go tak, jak to robisz doprowadzi do niezdefiniowanego zachowania - program może ulec awarii lub spowodować nieoczekiwane rezultaty. Lepiej używać klas opakowania - ATL::CComBSTR lub _bstr_t.