我有一个实现IDispatch接口的类(JSObject)。该类暴露于在托管的Web浏览器控件(IWebBrowser2)中运行的JavaScript。从C++函数返回字符串为JavaScript
这里了解如何工作参见:Calling C++ function from JavaScript script running in a web browser control
我可以从我的JavaScript代码调用到JSObject,并且可以接收返回整数/多头。但是当函数返回一个字符串(BSTR)时会出错。
这是IDispatch::Invoke()
代码的一部分:
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);?
与上面的代码,你可以alert()
返回的字符串,但不能添加到它。 alert(returnedString + "foo");
只会显示“返回的字符串”。 “foo”部分未添加到字符串中。不知怎的,字符串的结尾似乎有些问题。任何想法的人?我是不是在打SysFreeString()
?
编辑:
我暂时列入atlbase.h所以我可以使用CComBSTR
。上面的代码现在看起来是这样的:
pVarResult->vt = VT_BSTR;
pVarResult->bstrVal = CComBSTR("test string");
通过代码步进明确表明pVarResult是“测试字符串”一路,直到函数返回。但是,当我在JavaScript代码中alert()返回的字符串时,我得到“扩展”。 alert(returnedString + "foo")
是“expandedfoo”。所以这是向正确方向迈出的一小步,因为您可以添加到返回的字符串中。但它也是在错误的方向作为返回串的步骤是不是我真的回来......
*pVarResult = CComVariant("test string");
该代码给出了相同的结果在前面的列表中(使用的CComBSTR)的代码。
我没有看到它(用于ATL),但仅供参考:Out参数由调用者拥有,因此调用者可以释放该字符串。请参阅[内存管理规则](http://msdn.microsoft.com/en-us/library/ms810016.aspx)。 – 2010-09-20 21:22:50
@Georg:太好了。所以至少我没有泄漏记忆。 – Tobbe 2010-09-20 21:59:20