2010-07-23 9 views
5

Ich versuche, eine wchar_t * zu BSTR zu konvertieren.C++: wchar_t * in BSTR konvertieren?

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

using namespace std; 

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

    BSTR bstr(pwsz); 

    cout << SysStringLen(bstr) << endl; 

    getchar(); 
} 

Dieser druckt 0, das ist weniger als das, was ich gehofft hatte. Was ist der richtige Weg für diese Konvertierung?

Antwort

9

Sie müssen SysAllocString (und dann SysFreeString) verwenden.

BSTR bstr = SysAllocString(pwsz); 

// ... 

SysFreeString(bstr); 

A BSTR ist eine verwaltete Zeichenfolge mit den Zeichen der Zeichenfolge durch ihre Länge vorangestellt. SysAllocString reserviert die korrekte Speichermenge und richtet die Länge und den Inhalt der Zeichenfolge korrekt ein. Wenn die BSTR richtig initialisiert wird, sollte SysStringLen die richtige Länge zurückgeben.

Wenn Sie C++ verwenden, sollten Sie eine RAII-Stilklasse (oder sogar Microsofts _bstr_t) in Erwägung ziehen, um sicherzustellen, dass Sie keine SysFreeString Aufrufe vergessen.

1

ich am einfachsten denken, ist entweder

CString

oder

CComBSTR

beide Methoden zu verwenden, die das tun, was Charles erwähnt

+1

'CString' _wrap_ keinen' BSTR', obwohl es ein Verfahren, hat eine '' BSTR' aus einem CString' ('.AllocSysString()') zuzuteilen. 'CString' hilft jedoch nicht beim automatischen Freigeben eines' BSTR'. –

+0

gut in einem Sinne wickelt die Funktionalität zu einem BSTR konvertieren, was das OP wollte, aber technisch sind Sie richtig, so war meine Wahl der Wörter nicht richtig. –

2

SysStringLen() sollte nur auf BSTRs verwendet werden zugewiesen von SysAllocString() Familienfunktionen. Wenn Sie dies verwenden, führt dies zu undefiniertem Verhalten - das Programm kann abstürzen oder zu unerwarteten Ergebnissen führen. Besser noch Wrapper-Klassen verwenden - ATL::CComBSTR oder _bstr_t.