safeArray的使用方法

方法一:使用SafeArrayAllocDescriptor在栈上创建一维数组

 

//创建SAFEARRAY数组,每个元素为long型,该数组是一维数组

long nData[10]={1,2,3,4,5,6,7,8,9,10};

SAFEARRAY* pArray=NULL;

HRESULT hr=SafeArrayAllocDescriptor(1,&pArray);//创建SAFEARRAY结构的对象

if(hr!=S_OK)

return;

pArray->cbElements=sizeof(nData[0]);

pArray->rgsabound[0].cElements=10;

pArray->rgsabound[0].lLbound=0;

pArray->pvData=nData;

pArray->fFeatures=FADF_AUTO|FADF_FIXEDSIZE;//FADF_AUTO指定在栈上分配数据,并且大小不可以改变(固定为10)

//访问SAFEARRAY数组

long* pValue=NULL;

SafeArrayAccessData(pArray,(void**)&pValue);

for(int i=0;irgsabound[0].cElements;i++)

{

cout<

}

SafeArrayUnaccessData(pArray);

SafeArrayDestroy(pArray);

这种方法在栈上分配数组元素所占的空间,即nData数组所用的空间

方法二:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建一维数组

//创建SAFEARRAY数组,每个元素为long型,该数组是一维数组

long nData[10]={1,2,3,4,5,6,7,8,9,10};

SAFEARRAY* pArray=NULL;

HRESULT hr=SafeArrayAllocDescriptor(1,&pArray);//创建SAFEARRAY结构的对象

if(hr!=S_OK)

return;

pArray->cbElements=sizeof(nData[0]);

pArray->rgsabound[0].cElements=10;

pArray->rgsabound[0].lLbound=0;

SafeArrayAllocData(pArray);//注意:这句要写在给pvData赋值前面,不然用nData给pArray赋值后,使用SafeArrayAllocData会把数据清零

pArray->pvData=nData;

pArray->fFeatures=FADF_AUTO|FADF_FIXEDSIZE;//FADF_AUTO指定在栈上分配数据,并且大小不可以改变(固定为10)

//访问SAFEARRAY数组

long* pValue=NULL;

SafeArrayAccessData(pArray,(void**)&pValue);

for(int i=0;irgsabound[0].cElements;i++)

{

cout<

}

SafeArrayUnaccessData(pArray);

SafeArrayDestroy(pArray);

方法三:使用SafeArrayAllocDescriptor和SafeArrayAllocData在堆上创建二维数组

//定义并初始化设置SafeArray存储第一行3个元素,第二行4个元素的二维数组

SAFEARRAY* pArray = NULL;

HRESULT hr = SafeArrayAllocDescriptor(2,&pArray);

if(hr != S_OK)

return;

pArray->cbElements = sizeof(long);

pArray->rgsabound[0].cElements = 3;

pArray->rgsabound[0].lLbound = 0;

pArray->rgsabound[1].cElements = 4;

pArray->rgsabound[1].lLbound = 0;

SafeArrayAllocData(pArray);

//为safeArray的元素赋予值

long lDimension[2]={0};

long element = 1; //safeArray元素值

//第一行赋值

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

{

lDimension[0] = i; //列

lDimension[1] = 0; //行

SafeArrayPutElement(pArray,lDimension,(void*)&element);

element++;

}

//第二行赋值

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

{

lDimension[0] = i; //列

lDimension[1] = 1; //行

SafeArrayPutElement(pArray,lDimension,(void*)&element);

element++;

}

//获取元素

for(int i=0;i<3;i++) //第一行

{

long getElem(0);

lDimension[0] = i;

lDimension[1] = 0;

SafeArrayGetElement(pArray,lDimension,(void*)&getElem);

cout<

}

cout<

for(int i=0;i<4;i++) //第二行

{

long getElem(0);

lDimension[0] = i;

lDimension[1] = 1;

SafeArrayGetElement(pArray,lDimension,(void*)&getElem);

cout<

}

cout<

二维SAFEARRAY数组使用的时候下标要注意,这里采用的是列主序的方式,即lDimension[1]代表行,lDimension[0]代表列。

方法四:使用SafeArrayCreate在堆上创建一维数组

long nData[10]={1,2,3,4,5,6,7,8,9,10};

SAFEARRAYBOUND Bound[1]={0};

Bound[0].lLbound = 0;

Bound[0].cElements = 10;

SAFEARRAY* pArray=SafeArrayCreate(VT_I4,1,Bound);

pArray->pvData = nData;

//获取数据

long *pData=NULL;

HRESULT hr=SafeArrayAccessData(pArray,(void**)&pData);

for(int i=0;irgsabound[0].cElements;i++)

{

cout<

}

SafeArrayUnaccessData(pArray);

SafeArrayDestroy(pArray);

方法五:使用SafeArrayCreate在堆上创建二维数组

SAFEARRAYBOUND Bound[2]={0};

Bound[0].lLbound = 0;

Bound[0].cElements = 10;

Bound[1].lLbound = 0;

Bound[1].cElements = 3;

SAFEARRAY* pArray=SafeArrayCreate(VT_I4,2,Bound);

long Demen[2];

int element=1;

//第一行赋值

for(long i=0;i<10;i++)

{

Demen[0] = i;

Demen[1] = 0;

SafeArrayPutElement(pArray,Demen,(void*)&element);

element++;

}

//第二行赋值

for(long i=0;i<3;i++)

{

Demen[0] = i;

Demen[1] = 1;

SafeArrayPutElement(pArray,Demen,(void*)&element);

element++;

}

//获取数据

for(int i=0;i<10;i++) //第一行

{

long getElem(0);

Demen[0] = i;

Demen[1] = 0;

SafeArrayGetElement(pArray,Demen,(void*)&getElem);

cout<

}

cout<

for(int i=0;i<3;i++) //第二行

{

long getElem(0);

Demen[0] = i;

Demen[1] = 1;

SafeArrayGetElement(pArray,Demen,(void*)&getElem);

cout<

}

cout<

组件/客户中传递SAFEARRAY的原则:

1) 在堆上创建SAFEARRAY数组

2) 一方创建,一方回收

3) 接收方不可以修改SAFEARRAY的数据,只能读或者销毁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值