Retornando string para JavaScript da função C ++

Eu tenho uma classe (JSObject) que implementa a interface IDispatch. A classe está exposta ao JavaScript em execução no meu controle de navegador da web hospedado (IWebBrowser2).

Veja mais aqui sobre como isso funciona:Chamando a função C ++ do script JavaScript em execução em um controle de navegador da web

Posso ligar para o JSObject a partir do meu código JavaScript e receber números inteiros / longos retornados. Mas algo dá errado quando a função retorna uma string (BSTR).

Isso faz parte doIDispatch::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);?

Com o código acima, você podealert() a sequência retornada, mas você não pode adicionar a ela.alert(returnedString + "foo"); mostrará apenas "String retornada". A parte "foo" não é adicionada à string. Parece haver algo errado com o final da string de alguma forma. Alguma idéia para alguém?

Além disso, estou vazando memória aqui, já que não estou ligandoSysFreeString()?

EDITAR:

Incluí temporariamente atlbase.h para poder usarCComBSTR. O código acima agora se parece com isso:

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

Percorrer esse código definitivamente mostra que pVarResult é uma "cadeia de teste" até o retorno da função. Mas quando eu alerto () a string retornada no meu código JavaScript, fico "expandida".alert(returnedString + "foo") é "expandido". Portanto, é um pequeno passo na direção certa, como você pode adicionar à string retornada. Mas também é um passo na direção errada, pois a string retornada não é o que eu realmente retornei ...

*pVarResult = CComVariant("test string");

Esse código fornece os mesmos resultados que o código da listagem anterior (usando CComBSTR).

questionAnswers(2)

yourAnswerToTheQuestion