分享

C++使用VARIANT传递数组的方法

 好景宜人 2015-08-01
转自:http://blog./a/17649.htm                  
在使用COM/DCOM写组件时经常要传递数组,一般比如SHORT,LONG等指针可以直接传递相应的指针,但是当遇到需要传递BYTE数组就有问题了,COM不支持BYTE类型参数,传递BYTE数组也就无从说起了。其实VARIANT变量可以传递任何类型的数组,下面将使用VARIANT数组的方法总结一下。其实在VARIANT传递数组的方法非常简单,只要理解SAFEARRAY数组的使用方法即可,实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型等信息。SafeArray使用步骤如下:[喝小酒的网摘]http://blog./a/17649.htm

步骤一:生成SafeArray数组

VARIANT varChunk;

SAFEARRAY *psa; //使用数组整理读取的数据

SAFEARRAYBOUND rgsabound[1];

rgsabound[0].cElements =len; //设置数组的大小

rgsabound[0].lLbound = 0;

psa = SafeArrayCreate(VT_UI1,1,rgsabound); //创建SafeArray数组

步骤二:给SafeArray赋值与读取

给SafeArray赋值或读取有两种方法,一种是直接读取数据缓冲区,一种是通过函数一个一个读取数组每个变量值,很显然前一种方法比后一种方法的效率要高很多,下面就两种方法分别给出相应代码

(1) 直接读取缓冲区

读取

BYTE *buf;

SafeArrayAccessData(psa, (void **)&buf); //安全指针
//直接接作buf即可
SafeArrayUnaccessData(psa); //关闭后仍然可读取数据,但不能写入

写入

BYTE *buf;

SafeArrayAccessData(psa, (void **)&buf); //安全指针
//直接接作buf即可
SafeArrayUnaccessData(psa);

(2) 利用函数单个读取(SafeArrayGetElement,SafeArrayPutElement)

读取

long len=psa->rgsabound[0].cElements;

BYTE *pData=new BYTE[len];

for (int i=0;i<len;i++)

{

::SafeArrayGetElement(psa,&i,pData+i)

}

写入

long len=psa->rgsabound[0].cElements;

for (int i=0;i<len;i++)

{

::SafeArrayPutElement(psa,&i,pData[i])

}

步骤三:将安全数组与VARIANT相互赋值

将安全数组赋值给VARIANT

VARIANT varChunk;

varChunk.vt = VT_ARRAY|VT_UI1; //数组类型

varChunk.parray = psa;

将VARIANT赋值给安全数组

SAFEARRAY *psa=varChuank.parray;

最后,一定要记得释放数组,否则会有内存泄漏。

SafeArrayDestroy(psa);[喝小酒的网摘]http://blog./a/17649.htm

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多