VC代码片断:
short CVC::GetList(BSTR List)
{
CString szList = _T("new string");
wcscpy(List, szList);
return 0;
}
BEGIN_DISPATCH_MAP(CVC, COleControl)
DISP_FUNCTION(CVC, "GetList", GetList, VT_I2, VTS_BSTR)
END_DISPATCH_MAP()
afx_msg short GetList(BSTR List);
[id(1)] short GetList(BSTR List);
JavaScript调用:
//开一个足够大的字符串空间
var aa = "11111111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111111";
obj.GetList(aa);
alert( aa);
说明:1、这种方法可能会造成一些内存泄露,没有验证过。
2、在比较字符串时要在末尾加上"/0",这是因为C/C++是以 "/0"结尾,而javascript好像不是(我也不知)
如:var flag = "11111";
obj.IsTrue(flag); //在里面给flag赋值为字符串"true"
if(flag == "true/0")
alert("OK");
网上也有这种调用方法:(这种我试了,不知道为什么不行)
IDL文件中这样声明
[id(1), helpstring("method GetString")] HRESULT GetString([out,retval]BSTR* pstr);
头文件中:
STDMETHOD(GetString)(/*[out,retval]*/BSTR* pstr);
CPP中
STDMETHODIMP CCJSString::GetString(BSTR *pstr)
{
USES_CONVERSION;
SysReAllocString(pstr, T2OLE("xxxx"));
return S_OK;
}
JS中直接调用就可以了,不需要填写参数 var xx= xxx.GetString();