2010-07-23 27 views
5

Estoy tratando de convertir un wchar_t * en BSTR.C++: ¿Convierte wchar_t * en BSTR?

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

using namespace std; 

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

    BSTR bstr(pwsz); 

    cout << SysStringLen(bstr) << endl; 

    getchar(); 
} 

Esto imprime 0, que es menos de lo que yo esperaba. ¿Cuál es la forma correcta de hacer esta conversión?

Respuesta

9

Necesita usar SysAllocString (y luego SysFreeString).

BSTR bstr = SysAllocString(pwsz); 

// ... 

SysFreeString(bstr); 

Un BSTR es una cadena gestionada con los caracteres de la cadena con el prefijo de su longitud. SysAllocString asigna la cantidad correcta de almacenamiento y configura la longitud y el contenido de la cadena correctamente. Con el BSTR correctamente inicializado, SysStringLen debe devolver la longitud correcta.

Si está usando C++, puede considerar usar una clase de estilo RAII (o incluso _bstr_t de Microsoft) para asegurarse de no olvidar ninguna llamada SysFreeString.

1

Creo más fácil es o bien utilizar

CString

o

CComBSTR

ambos tienen métodos que lo que Charles mencionó

+1

'CString' no _wrap_ a' BSTR', aunque tiene un método para asignar un 'BSTR' de' CString' ('.AllocSysString()'). 'CString' no ayuda con la liberación automática de un' BSTR', sin embargo. –

+0

bien en cierto sentido, envuelve la funcionalidad para convertir a un BSTR que era lo que el OP quería, pero técnicamente está en lo correcto, así que mi elección de palabras no era la correcta. –

2

SysStringLen() debe ser utilizado en BSTR asignados por SysAllocString() funciones familiares. Usarlo como lo hace dará lugar a un comportamiento indefinido: el programa puede fallar o producir resultados inesperados. Mejor aún, use las clases de envoltura: ATL::CComBSTR o _bstr_t.