我有一個實現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