方法一:使用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的数据,只能读或者销毁