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
相关文章读者评论发表评论 |