String von C ++ - Funktion an JavaScript zurückgeben

Ich habe eine Klasse (JSObject), die die IDispatch-Schnittstelle implementiert. Die Klasse ist JavaScript ausgesetzt, das in meinem gehosteten Webbrowser-Steuerelement (IWebBrowser2) ausgeführt wird.

Siehe hier mehr darüber, wie das funktioniert:ufruf der C ++ - Funktion aus einem JavaScript-Skript, das in einem Webbrowser-Steuerelement ausgeführt wi

Ich kann JSObject über meinen JavaScript-Code aufrufen und zurückgegebene Ganzzahlen / Longs empfangen. Aber etwas geht schief, wenn die Funktion einen String (BSTR) zurückgibt.

Dies ist ein Teil desIDispatch::Invoke() code:

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);?

Mit dem obigen Code können Siealert() die zurückgegebene Zeichenfolge, kann aber nicht hinzugefügt werden.alert(returnedString + "foo"); zeigt nur "Returned string" an. Der Teil "foo" wird der Zeichenfolge nicht hinzugefügt. Irgendwie scheint etwas mit dem Ende der Saite nicht in Ordnung zu sein. Irgendwelche Ideen?

Auch leck ich Speicher hier, da ich nicht anrufeSysFreeString()?

BEARBEITEN

Ich habe vorübergehend atlbase.h eingefügt, damit ich @ verwenden kanCComBSTR. Der obige Code sieht jetzt so aus:

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

Stepping durch diesen Code zeigt definitiv, dass pVarResult den ganzen Weg "Teststring" ist, bis die Funktion zurückkehrt. Aber wenn ich den zurückgegebenen String in meinem JavaScript-Code alarmiere (), bekomme ich "expandiert".alert(returnedString + "foo") ist "Expandedfoo". Es ist also ein kleiner Schritt in die richtige Richtung, da Sie den zurückgegebenen String ergänzen können. Aber es ist auch ein Schritt in die falsche Richtung, da der zurückgegebene String nicht das ist, was ich wirklich zurückgegeben habe ...

*pVarResult = CComVariant("test string");

Dieser Code liefert die gleichen Ergebnisse wie der Code in der vorherigen Auflistung (mit CComBSTR).

Antworten auf die Frage(4)

Ihre Antwort auf die Frage