控件的方法:fun(BYTE* buf)调用者创建一个字节缓冲区,由fun填充数据,返回后调用者使用数据。
当我在.net平台中使用该控件时,该参数被映射到了ref byte。
我在fun中填充了buf后,在调用端发现只有buf[0]被填充了,后面都没变。大概是我不应该选择BYTE* buf,那我该选择什么类型?
当我在.net平台中使用该控件时,该参数被映射到了ref byte。
我在fun中填充了buf后,在调用端发现只有buf[0]被填充了,后面都没变。大概是我不应该选择BYTE* buf,那我该选择什么类型?
用MFC的控件在声明的时候这个函数对应的一个调度映射对参数的声明不支持
DISP_FUNCTION_ID(CDrawCurveCtrl, "SetData", dispidSetData, SetData, VT_EMPTY, VTS_I4 VTS_PR8)
这是我的一个函数的声明,函数的原型是
void SetData(LONG NumData,DOUBLE CurveData[]);
也是一个向COM中传入数组的功能.
我测试过,这个函数只有第一个数是正确的,其它的数都是随机数
像上面提到的函数
void SetData(LONG NumData,DOUBLE CurveData[]);
只要作以下声明就可以了
[id(1), helpstring("输入分析数据")] HRESULT SetData([[in] LONG NumData, [in, size_is(NumData)] DOUBLE DataAnalyse[]);
这里使用了size_is这个接口声明的关键字,这个关键字就是用来声明数组的,这里要一个数组长度的参数,NumData就是数组的长度.
这种方法,我做过测试,可以实现输入数组的功能
HRESULT aa(
[in] short m;
[in,size_is(m)] byte pshort[]);//但是byte这个类型oleautomation不支持、double可以,遗憾中!!
所以鉴于上式不成立,我想只能用variant包含safearray传了。我说的是vc6以下。vc.net中好像有改进!!没试过。这是MSDN的一句话:
使用符合自动化的数据类型
运行库封送处理服务自动支持所有符合自动化的数据类型。不一定支持不符合的类型。