Devolviendo cadena a JavaScript desde la función C ++

Tengo una clase (JSObject) que implementa la interfaz IDispatch. La clase está expuesta a JavaScript que se ejecuta en mi control de navegador web alojado (IWebBrowser2).

Vea más aquí sobre cómo funciona esto:Llamar a la función C ++ desde un script JavaScript que se ejecuta en un control de navegador web

Puedo llamar a JSObject desde mi código JavaScript y puedo recibir enteros / longs devueltos. Pero algo sale mal cuando la función devuelve una cadena (BSTR).

Esto es parte deIDispatch::Invoke() código:

int lenW = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, "Returned string", -1, 
    NULL, 0);
BSTR bstrRet = SysAllocStringLen(0, lenW);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, "Returned string", -1, bstrRet, 
    lenW);

pVarResult->vt = VT_BSTR;
pVarResult->bstrVal = bstrRet;

// Who calls SysFreeString(bstrRet);?

Con el código anterior puedesalert() la cadena devuelta, pero no puede agregarla.alert(returnedString + "foo"); solo mostrará "Cadena devuelta". La parte "foo" no se agrega a la cadena. Parece que hay algo mal con el final de la cadena de alguna manera. ¿Alguna idea de alguien?

Además, ¿estoy perdiendo memoria aquí ya que no estoy llamandoSysFreeString()?

EDITAR:

Incluí temporalmente atlbase.h para poder usarCComBSTR. El código anterior ahora se ve así:

pVarResult->vt = VT_BSTR;
pVarResult->bstrVal = CComBSTR("test string");

Pasar por ese código definitivamente muestra que pVarResult es "cadena de prueba" hasta que la función vuelve. Pero cuando alerta () la cadena devuelta en mi código JavaScript me aparece "expandido".alert(returnedString + "foo") es "expandidofoo". Por lo tanto, es un pequeño paso en la dirección correcta, ya que puede agregar a la cadena devuelta. Pero también es un paso en la dirección incorrecta ya que la cadena devuelta no es lo que realmente devolví ...

*pVarResult = CComVariant("test string");

Ese código da los mismos resultados que el código de la lista anterior (usando CComBSTR).

Respuestas a la pregunta(2)

Su respuesta a la pregunta