专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C 教程 » safearray:safeArray的使用方法 »正文

safearray:safeArray的使用方法

来源: 发布时间:星期三, 2008年9月24日 浏览:104次 评论:0
方法一:使用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;i<pArray->rgsabound[0].cElements;i++)
{
cout<<pValue[i]<<endl;
}
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;i<pArray->rgsabound[0].cElements;i++)
{
cout<<pValue[i]<<endl;
}
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<<getElem<<"\t";
}
cout<<endl;
for(int i=0;i<4;i++) //第二行
{
long getElem(0);
lDimension[0] = i;
lDimension[1] = 1;
SafeArrayGetElement(pArray,lDimension,(void*)&getElem);
cout<<getElem<<"\t";
}
cout<<endl;
二维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;i<pArray->rgsabound[0].cElements;i++)
{
cout<<pData[i]<<endl;
}
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<<getElem<<"\t";
}
cout<<endl;
for(int i=0;i<3;i++) //第二行
{
long getElem(0);
Demen[0] = i;
Demen[1] = 1;
SafeArrayGetElement(pArray,Demen,(void*)&getElem);
cout<<getElem<<"\t";
}
cout<<endl;

组件/客户中传递SAFEARRAY的原则:
1) 在堆上创建SAFEARRAY数组
2) 一方创建,一方回收
3) 接收方不可以修改SAFEARRAY的数据,只能读或者销毁


0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: