2010-07-23 9 views
5

Sto provando a convertire un wchar_t * in BSTR.C++: converte wchar_t * in BSTR?

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

using namespace std; 

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

    BSTR bstr(pwsz); 

    cout << SysStringLen(bstr) << endl; 

    getchar(); 
} 

Questo stampa 0, che è meno di quello che avevo sperato. Qual è il modo corretto di fare questa conversione?

risposta

9

È necessario utilizzare SysAllocString (e quindi SysFreeString).

BSTR bstr = SysAllocString(pwsz); 

// ... 

SysFreeString(bstr); 

Un BSTR è una stringa gestita con i caratteri della stringa prefisso loro lunghezza. SysAllocString alloca la quantità corretta di memoria e imposta correttamente la lunghezza e il contenuto della stringa. Con BSTR inizializzato correttamente, SysStringLen dovrebbe restituire la lunghezza corretta.

Se si utilizza C++, è possibile prendere in considerazione l'utilizzo di una classe di stile RAII (o anche di Microsoft _bstr_t) per assicurarsi di non dimenticare alcuna chiamata SysFreeString.

1

Credo che più semplice è o da usare

CString

o

CComBSTR

entrambi hanno metodi che fare quello che Charles menzionato

+1

'CString' non esegue _wrap_ un' BSTR', sebbene abbia un metodo per allocare un 'BSTR' da un' CString' ('.AllocSysString()'). 'CString' non aiuta tuttavia a liberare automaticamente un' BSTR'. –

+0

beh in un certo senso avvolge la funzionalità per convertire in un BSTR che era ciò che l'OP voleva, ma tecnicamente sei corretto, quindi la mia scelta delle parole non era giusta. –

2

SysStringLen() deve essere utilizzato solo su BSTRs assegnate per funzioni familiari SysAllocString(). Usarlo come si farà porterà a comportamenti non definiti - il programma può bloccarsi o produrre risultati imprevisti. Meglio ancora utilizzare le classi wrapper: ATL::CComBSTR o _bstr_t.