2010-11-29 30 views

Respuesta

6

A BSTR es en realidad un WCHAR* con un prefijo de longitud. El valor BSTR apunta al comienzo de la cadena, no al prefijo de longitud (que se almacena en los bytes solo "antes" de la ubicación a la que apunta el BSTR).

En otras palabras, puede tratar un BSTR como si fuera un const WCHAR*. Sin conversión necesaria

Entonces, la pregunta es realmente: “¿Cómo puedo convertir una cadena Unicode (WCHAR*) a un char*?” Y la respuesta es utilizar la función API ::WideCharToMultiByte como se explica here. O bien, si está utilizando MFC/ATL en su aplicación, use el ATL and MFC Conversion Macros.

0
typedef OLECHAR FAR * BSTR; 
typedef WCHAR OLECHAR; 

De here.

WCHAR *. Es un char amplio, no un char. Esto significa que es Unicode, no ASCII y no debe convertirse. Si desea usar const char *, no use tipos anchos.

Aunque es posible que utilice algunos hackers, posiblemente pierda datos, ya que se convertirá el texto de Unicode a ASCII.

+0

Las cadenas de caracteres estrechas no tienen que ser ASCII. Podrían ser UTF-8, en cuyo caso aún podrá mostrar caracteres que generalmente se consideran anchos, p. Ej. Chino y japonés – CadentOrange

+0

Algunas funciones no tienen una versión ASCII. Por ejemplo, 'Graphics :: DrawString': http://msdn.microsoft.com/en-us/library/ms535991(VS.85).aspx – Default

4
#include "comutil.h" 

BSTR bstrVal; 
_bstr_t interim(bstrVal, false);  
    // or use true to get original BSTR released through wrapper 
const char* strValue((const char*) bstrVal); 

This maneja toda la conversión de ancho de banda a multibyte.