关于VC调用VB的用法,如何得到VB组件中的Variant,总是过不去,在线等待,来者送分
如下VB组件:
Public Function OutpHand() As Variant
Dim mpArray As Variant
ReDim mpArray(1 To 2)
'给返回数组赋值
mpArray(1) = "001"
mpArray(2) = "002"
OutpHand = mpArray
end function下面VC组件调用,只写出代码,整个组件结构太长了。如下
hr = pOutp.CreateInstance(__uuidof(OutpHand )); //创建调VB的对象
_variant_t varRetRcptNO; //返回收据数组
VariantInit(&varRetRcptNO);
//调用VB的商业层
varRetRcptNO = pOutp->OutpHand();
//判断数组是否为空
if(varRetRcptNO.vt != (VT_ARRAY|VT_VARIANT|VT_BYREF))
{
err=SysAllocString(L"收据返回值应为Variant数组");
throw 0L;
}
在上面它就 执行到 err=SysAllocString(L"收据返回值应为Variant数组");
跟踪varRetRcptNO.vt=8204为何么这不是数组呢?
注:
VT_ARRAY = 8192
VT_VARIANT = 12
VT_BYREF 16384
谢谢各位,可以再加分的,在线等待!!
如下VB组件:
Public Function OutpHand() As Variant
Dim mpArray As Variant
ReDim mpArray(1 To 2)
'给返回数组赋值
mpArray(1) = "001"
mpArray(2) = "002"
OutpHand = mpArray
end function下面VC组件调用,只写出代码,整个组件结构太长了。如下
hr = pOutp.CreateInstance(__uuidof(OutpHand )); //创建调VB的对象
_variant_t varRetRcptNO; //返回收据数组
VariantInit(&varRetRcptNO);
//调用VB的商业层
varRetRcptNO = pOutp->OutpHand();
//判断数组是否为空
if(varRetRcptNO.vt != (VT_ARRAY|VT_VARIANT|VT_BYREF))
{
err=SysAllocString(L"收据返回值应为Variant数组");
throw 0L;
}
在上面它就 执行到 err=SysAllocString(L"收据返回值应为Variant数组");
跟踪varRetRcptNO.vt=8204为何么这不是数组呢?
注:
VT_ARRAY = 8192
VT_VARIANT = 12
VT_BYREF 16384
谢谢各位,可以再加分的,在线等待!!
//调用VB的商业层
前加上
varRetRcptNO = VT_ARRAY|VT_VARIANT|VT_BYREF
加上了也不行
你判断的时候直接这样判断
if(varRetRcptNO.vt != (VT_ARRAY|VT_VARIANT))
{
...
}---------
++C++
---------
FlyYang(++X++)
这也是你这样判断的呀,只是又多加了一个 VT_BYREF
但返回结果不是这几种值中的任何一个
我是用mfc包装类测试的COutpHand oh;
oh.CreateDispatch("VVV1.OutpHand");
COleVariant v(oh.OutpHand());ASSERT(v.vt == (VT_VARIANT|VT_ARRAY));SAFEARRAY *psa = v.parray;
long lLBound, lUBound;
SafeArrayGetLBound(psa, 1, &lLBound);
SafeArrayGetUBound(psa, 1, &lUBound);for(long i = lLBound; i <= lUBound; i++)
{
COleVariant v;
SafeArrayGetElement(psa, &i, &v);
AfxMessageBox(CString(v.bstrVal));
}
: bcpl(我是宇宙中的一粒沙子)
太谢谢你了
可以了,完全正确太谢谢你了我试了五天了,一直没做出来,太谢谢你了