做了个控件,ATL的,我要返回一个数组,在网页中使用,用法如下:
var arr = xxCtrl.GetArray();我的代码是这样的。
IDL文件
--------------------------------------
[id(3), helpstring("方法GetArray")] HRESULT GetArray([out,retval] VARIANT* arr);xxx.h文件
------------------------------------
//类里面的函数声明
STDMETHOD(GetArray)(VARIANT* arr);xxx.cpp文件
-------------------------------------STDMETHODIMP CHelperCtrl::GetArray(VARIANT* arr)
{
SAFEARRAYBOUND saBound;
SAFEARRAY* pSA;
long index; saBound.cElements = 2;
saBound.lLbound = 0;
pSA = SafeArrayCreate( VT_BSTR, 1, &saBound );
BSTR bstr0 = SysAllocString(T2OLE(TEXT("item 0")));
BSTR bstr1 = SysAllocString(T2OLE(TEXT("item 1")));
index = 0;
SafeArrayPutElement( pSA, &index, bstr0);
index ++;
SafeArrayPutElement( pSA, &index, bstr1);
SysFreeString( bstr0 );
SysFreeString( bstr1 ); VariantInit( arr );
arr->vt = VT_ARRAY | VT_BSTR;
arr->parray = pSA;
return S_OK;
}------------------------------------------
以上是控件里的代码,
我的网页脚本是这样写的:
debugger;
jsArr = new Array("1111", "2222");
var arr = document.getElementById('HelperCtrl').GetArray();
alert(arr.length); //这句有问题我开启了IE脚本调试的功能,对js创建的数组和控件返回的数组作了比较。发现有如下不同,以下是调试时的信息:
名称 值 类型
--------------------------------------------
- arr {...} 数组 String //类型不是Object
(0) "item 0" String //访问内部元素的时候是用的()而不是[]
(1) "item 1" String
- jsArr {...} Object
[0] "1111" String
[1] "2222222" String
最后,请问如何才能从控件中获得一个js能够识别的数组呢?
var arr = xxCtrl.GetArray();我的代码是这样的。
IDL文件
--------------------------------------
[id(3), helpstring("方法GetArray")] HRESULT GetArray([out,retval] VARIANT* arr);xxx.h文件
------------------------------------
//类里面的函数声明
STDMETHOD(GetArray)(VARIANT* arr);xxx.cpp文件
-------------------------------------STDMETHODIMP CHelperCtrl::GetArray(VARIANT* arr)
{
SAFEARRAYBOUND saBound;
SAFEARRAY* pSA;
long index; saBound.cElements = 2;
saBound.lLbound = 0;
pSA = SafeArrayCreate( VT_BSTR, 1, &saBound );
BSTR bstr0 = SysAllocString(T2OLE(TEXT("item 0")));
BSTR bstr1 = SysAllocString(T2OLE(TEXT("item 1")));
index = 0;
SafeArrayPutElement( pSA, &index, bstr0);
index ++;
SafeArrayPutElement( pSA, &index, bstr1);
SysFreeString( bstr0 );
SysFreeString( bstr1 ); VariantInit( arr );
arr->vt = VT_ARRAY | VT_BSTR;
arr->parray = pSA;
return S_OK;
}------------------------------------------
以上是控件里的代码,
我的网页脚本是这样写的:
debugger;
jsArr = new Array("1111", "2222");
var arr = document.getElementById('HelperCtrl').GetArray();
alert(arr.length); //这句有问题我开启了IE脚本调试的功能,对js创建的数组和控件返回的数组作了比较。发现有如下不同,以下是调试时的信息:
名称 值 类型
--------------------------------------------
- arr {...} 数组 String //类型不是Object
(0) "item 0" String //访问内部元素的时候是用的()而不是[]
(1) "item 1" String
- jsArr {...} Object
[0] "1111" String
[1] "2222222" String
最后,请问如何才能从控件中获得一个js能够识别的数组呢?
other type. JavaScript can read safearrays of any type with the help of
VBArray object, but cannot produce any kind of safearray. An Array
object in JavaScript is not in any way related to a safearray - it's an
object implementing IDispatch, with each index being a separate
property. VBArray can convert a safearray to a JavaScript Array, but
there's no conversion the other way.A preferred way to pass a set of items to scripts is to create a
collection object.
var safeArr= document.getElementById('HelperCtrl').GetArray();
var vbArr = new VBArray(safeArr);总是说缺少VBArray
[问题提出]
ATL做com,想让一方法返回一数组,我这样声明:……[out,retval]SAFEARRAY** par)出错,为什么?最好能给一简单例子
[解决方法]
在COM方法中可用VARIANT类型传递数组数据,在VC++中用SAFEARRAY处理。下面给出输入和输出数组的例子 1。输入数组到COM中
STDMETHODIMP CTestCom1::vb2vc(VARIANT buffer)
{
long dim=SafeArrayGetDim(buffer.parray);
long ubound;
long lbound; SafeArrayGetUBound(buffer.parray,dim,&ubound);
SafeArrayGetLBound(buffer.parray,dim,&lbound);
BSTR* buf;
BSTR pd[2];
SafeArrayAccessData(buffer.parray,(void**)&buf);
for (int i=lbound;i<ubound;i++)
pd[i]=buf[i];
}
return S_OK;
}
buffer为一维数组,存放字符串,在vb中的代码为
Dim oo As ARRAYTESTLib.TestCom1
Set oo = New ARRAYTESTLib.TestCom1
Dim buf(2) As String
buf(0) = "65"
buf(1) = "anss"
oo.vb2vc buf
2。COM返回数组数据到vb STDMETHODIMP CTestCom1::retarray(VARIANT *buffer)
{
//返回数组
SAFEARRAY FAR* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements=2;
psa=SafeArrayCreate(VT_I4,1,rgsabound); long idx;
long setdt; idx=0;
setdt=12; SafeArrayPutElement(psa,&idx,&setdt);
idx=1;
setdt=342;
SafeArrayPutElement(psa,&idx,&setdt); V_VT(buffer) = VT_ARRAY | VT_I4;
V_ARRAY(buffer)=psa;
return S_OK;
}
vb中的代码为:
Dim oo As ARRAYTESTLib.TestCom1
Set oo = New ARRAYTESTLib.TestCom1
Dim rarr As Variant
oo.retarray rarr
MsgBox rarr(0) & rarr(1)