VB 写的ActiveX中函数使用了Variant 参数,vc如何调用?

andyred 2004-11-11 05:04:13
VB 写的ActiveX中函数使用了Variant 参数,vc如何调用?
ActiveX中的这个函数实际返回的是一个variant数组,长度不确定,请问我在vc中调用时应该
使用的参数类型是什么?我使用VARIANT时,总是报告参数类型不正确。

谢谢!
...全文
108 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
andyred 2004-11-12
  • 打赏
  • 举报
回复
风老哥,你好,看了你的帖子我获益颇多,真的非常感谢.

我在你的基础上加工之后,程序已经可以运行,但结果还不正确,
问题应该在于SafeArrayCreate第一个参数的设置上面,
GetDataObject具体返回的数组个数和每个元素的类型都是未知的,
我应该如何设置SafeArrayCreate的第一个参数?调用之后如何判断
具体每个元素的类型?我目前这样应该得到的是一个float或者double
但v2.vt 目前的值缺是 VT_STORED_OBJECT。

希望能再次指教一下

SAFEARRAY * psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 20;
psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
VARIANT obj;
obj.vt = VT_ARRAY;
obj.parray = psa;

pSoftbus.GetDataObject( "测试库", "D001", &obj );
ASSERT(obj.vt == (VT_ARRAY | VT_VARIANT));
SAFEARRAY *psa1 = obj.parray;
VARIANT* pd;
SafeArrayAccessData(psa1, (void**)&pd);
VARIANT v2 = pd[7];

double dv = v2.fltVal;
SafeArrayUnaccessData(psa);
CString str;
str.Format( "Value is: %f type: %d", dv, v2.vt );
AfxMessageBox( str );
andyred 2004-11-12
  • 打赏
  • 举报
回复
风老哥,你好

bluwindhrt 2004-11-12
  • 打赏
  • 举报
回复
VARIANT obj;
pSoftbus.GetDataObject( "测试库", "D001", &obj );
ASSERT(obj.vt == VT_ARRAY|VT_DOUBLE));
SAFEARRAY *psa = obj.parray;
double* pd;
SafeArrayAccessData(psa, (void**)&pd);
double dv = pd[7];
SafeArrayUnaccessData(psa):
CString str;
str.Format( "Value is: %f", dv );
AfxMessageBox( str );
andyred 2004-11-12
  • 打赏
  • 举报
回复
多谢兄台,我的清款是这样:

ActiveX别人已经写好,不能再动,我现在要在vc中使用。
通过class wizard->add class->from a type library加入到工程后代码如下:
short _SoftBus::GetDataObject(LPCTSTR objLib, LPCTSTR ObjID, VARIANT* obj)
{
short result;
static BYTE parms[] =
VTS_BSTR VTS_BSTR VTS_PVARIANT;
InvokeHelper(0x60030008, DISPATCH_METHOD, VT_I2, (void*)&result, parms,
objLib, ObjID, obj);
return result;
}

我是这样调用的:

_SoftBus pSoftbus;
VARIANT v;
v.vt = VT_R8;
v.dblVal = 10.0;

pSoftbus.CreateDispatch( "SoftBusExeServer.SoftBus");
pSoftbus.ModifyObject( "测试库", "D001", 8, v, TRUE );
VARIANT obj[20];
pSoftbus.GetDataObject( "测试库", "D001", obj ); //运行到这里出错, 在vb中调用
//它返回的是一个Variant类型的
//数组,长度不确定
double dv = obj[7].dblVal;
CString str;
str.Format( "Value is: %f", dv );
AfxMessageBox( str );
sinall 2004-11-12
  • 打赏
  • 举报
回复
你可以对这个variant进行操作啊
1、variant本身包含一种SafeArray。具体,你可以看看variant定义,及相关的api函数
2、可以用COleSafeArray包装variant,然后调用COleSafeArray的成员函数。
andyred 2004-11-12
  • 打赏
  • 举报
回复
哦,我现在明白了!

多谢二位啦!

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧