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