VARIANT CACtestCtrl::cstest(LPCTSTR tum)
{
VARIANT vaResult;
CString strResult;
VARIANT vFlag[2];
int i;
MessageBox("1111111111111111");
VariantInit(&vaResult);
for (i =0; i < 3; i++)
{
VariantInit(&vFlag[i]);
V_VT(&vFlag[i]) = VT_BSTR;
} SAFEARRAY* psa; //build a SAFFERRAY
SAFEARRAYBOUND rgsabound[2];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 6; //data length by byte
rgsabound[1].lLbound = 0;
rgsabound[1].cElements = 1; //data length by byte
psa = SafeArrayCreate(VT_BSTR, 2, rgsabound); V_BSTR(&vFlag[0]) = SysAllocString(OLESTR("111222"));
V_BSTR(&vFlag[1]) = SysAllocString(OLESTR("3"));
long lZero = 0;
long lOne = 1;
SafeArrayPutElement(psa,&lZero,&vFlag[0]);
SafeArrayPutElement(psa,&lOne,&vFlag[1]);
vaResult.vt = (VT_ARRAY | VT_BSTR );
vaResult.parray = psa; SafeArrayDestroy(psa);
// TODO: Add your dispatch handler code here
return vaResult;
}返回2维数组,我在js里面 调用,怎么只能打印出11111111,数组没有显示????
var jsa = new VBArray(document.getElementById("MyActest").cstest(sRet)).toArray();
alert(jsa);
{
VARIANT vaResult;
CString strResult;
VARIANT vFlag[2];
int i;
MessageBox("1111111111111111");
VariantInit(&vaResult);
for (i =0; i < 3; i++)
{
VariantInit(&vFlag[i]);
V_VT(&vFlag[i]) = VT_BSTR;
} SAFEARRAY* psa; //build a SAFFERRAY
SAFEARRAYBOUND rgsabound[2];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 6; //data length by byte
rgsabound[1].lLbound = 0;
rgsabound[1].cElements = 1; //data length by byte
psa = SafeArrayCreate(VT_BSTR, 2, rgsabound); V_BSTR(&vFlag[0]) = SysAllocString(OLESTR("111222"));
V_BSTR(&vFlag[1]) = SysAllocString(OLESTR("3"));
long lZero = 0;
long lOne = 1;
SafeArrayPutElement(psa,&lZero,&vFlag[0]);
SafeArrayPutElement(psa,&lOne,&vFlag[1]);
vaResult.vt = (VT_ARRAY | VT_BSTR );
vaResult.parray = psa; SafeArrayDestroy(psa);
// TODO: Add your dispatch handler code here
return vaResult;
}返回2维数组,我在js里面 调用,怎么只能打印出11111111,数组没有显示????
var jsa = new VBArray(document.getElementById("MyActest").cstest(sRet)).toArray();
alert(jsa);
两个元素,
后面的:
for (i =0; i < 3; i++)
{
VariantInit(&vFlag[i]);
V_VT(&vFlag[i]) = VT_BSTR;
}
访问3个,是个BUG
long lZero[]={0,0};
long lOne[]={0,1};
SafeArrayPutElement(psa,&lZero,&vFlag[0]);
SafeArrayPutElement(psa,&lOne,&vFlag[1]);
要改为:
SafeArrayPutElement(psa,lZero,&vFlag[0]);
SafeArrayPutElement(psa,lOne,&vFlag[1]);
//==================================================================================
//功能说明:将VARIANT newVal(数组)中的数据存储到m_vecClassID中
//==================================================================================
STDMETHODIMP CImageClassification::put_ClassifiedIDs(VARIANT newVal)
{
// 检查数组元素是否为空
if (newVal.vt==VT_NULL || newVal.vt== VT_EMPTY)
{
return S_FALSE;
} // 检查传入参数类型是否为数组
if (!(newVal.vt & VT_ARRAY))
{
return S_FALSE;
}
// 声明SafeArray的缓冲区,指向传入参数的数组数据
SAFEARRAY *psa = newVal.parray; // 获取数组的维数
UINT nDims = SafeArrayGetDim(psa); // 检查数组的维数
if (nDims != 1)
{
return S_FALSE;
} // 定义数组元素类型
VARTYPE vt = 0; // 获取数组元素类型
SafeArrayGetVartype(psa,&vt); // 检查数组元素类型
if (vt != VT_I4) // long || int
{
return S_FALSE;
} HRESULT hr;
int *pData = NULL; // pData之前不用申请内存空间,可能是下面的函数自动为其申请了
hr = SafeArrayAccessData(psa,(void **)&pData); // 用SafeArrayAccessData直接读SafeArray的缓冲区,并将数据保存到内存pData中
if (FAILED(hr))
{
return S_FALSE;
} // 清空m_vecClassID
m_vecClassID.clear(); // 从内存pData中读取数据,保存到m_vecClassID中
for (unsigned long index = 0;index < psa->rgsabound[0].cElements;index++)
{
m_vecClassID.push_back(pData[index]);
} // 释放SafeArray的缓冲区
SafeArrayUnaccessData(psa); return S_OK;
}
blog.csdn.net/jkler_doyourself/archive/2008/08/08/2786643.aspx
blog.csdn.net/jkler_doyourself/archive/2008/08/08/2786643.aspx