-
SAFEARRAY
使用
目录:
SAFEARRAY
使用实例
1
目录:
1
前言:
1
何谓
SAFEARRAY
:
1
创建
SAFEARRAY: 2
方法
一:使用
SafeArrayAllocDescriptor
在栈上创建一维数组
2
方法二:使用
SafeArrayAllocDescriptor
和
Sa
feArrayAllocData
在堆上创建一
维数组
2
方法三:使用
SafeArrayAl
locDescriptor
和
SafeArrayAlloc
Data
在堆上创建二
维数组
3 <
/p>
方法四:使用
SafeArrayCreate
< br>在堆上创建一维数组
4
方法五:使用
SafeArrayCreate
在堆上创建二维数组
5
方法六:使用
SafeArrayCreateEx
创建包含结构的一维数组
5
访问
SAFEARRAY: 7
方法
一:使用
SafeArrayAccessData
方法
7
方法二:使用
SafeArrayGe
tElement
和
SafeArrayPutElement
7
CComSafeArray
类介绍:
8
基本的入门例子
: 8
注意事项:
8
前言:
SAFEARRAY
使用总是困扰很多人,为了把这个问题说个明白,我把我目前掌握的知识做个
总结
何谓
SAFEARRAY
:
SAFE
ARRAY
实际上是一个结构,关于这部分可以参考
MSDN<
/p>
。
ms-
help://R.2003FEB.2052/automat/htm/chap7_
我们不需要关心
16
位操作系统下的定义,因为我们团队只
在
WIN2000
以上平台下开发。
创建
SAFEARRAY:
方法一:使用
SafeArrayAllocDescriptor<
/p>
在栈上创建一维数组
//
创建
SAFEARRAY
数组,每个元素为
long
型,该数组是一维数组
long nData[10]={1,2,3,4,5,6,7,8,9,10};
SAFEARRAY* pArray=NULL;
HRESULT hr=SafeArrayAllocDescriptor(1,&
pArray);//
创建
SAFEARRAY
结构
的对象
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
p>
指定在栈上分配
数据,并且大小不可以改变(固定为
10
)
< br>//
访问
SAFEARRAY
数
组
long* pValue=NULL;
SafeArrayAccessData(pArray,(void**)&pValue);
long Low(0),High(0);
hr=Safe
ArrayGetLBound(pArray,1,&Low);//
维数索引从
p>
1
开始
hr=S
afeArrayGetUBound(pArray,1,&High);//
维数索
引从
1
开始
SafeArrayUnaccessData(pArray);
SafeArrayDestroy(pArray);
这种
方法在栈上分配数组元素所占的空间,即
nData
数组所用的
空间
方
法二:使用
SafeArrayAllocDescriptor
和
SafeArrayAllocData
在堆上创建一
p>
维数组
//
创建
SAFEARRAY
数组,每个元素为
long
型,该数组是一维数组
long nData[10]={1,2,3,4,5,6,7,8,9,10};
SAFEARRAY* pArray=NULL;
HRESULT hr=SafeArrayAllocDescriptor(1,&
pArray);//
创建
SAFEARRAY
结构
的对象
pArray->cbElements=sizeof(nData[0]);
pArray->rgsabound[0].cElements=10;
pArray->rgsabound[0].lLbound=0;
SafeArrayAllocData(pArray);
long* pData=NULL;
SafeArrayA
ccessData(pArray,(void**)&pData);
long
l(0),h(0);
SafeArrayGetLBound(pArray,1,&l);
SafeArrayGetUBound(pArray,1,&h);
long Size=h-l+1;
SafeArrayAc
cessData(pArray,(void**)&pData);
for(long Idx=l;Idx
{
pData[Idx]=nData[Idx];
}
SafeArrayUnaccessData(pArray);
//
访问
S
AFEARRAY
数组
long*
pValue=NULL;
SafeArrayAccessData(pArray
,(void**)&pValue);
long Low(0),High(0);
hr=SafeArrayGetLBound(pArray,1,&Low);//
维数索引从
1
开始
hr=SafeArrayGetUBound(pArray,1,&High
);//
维数索引从
1
开始
SafeArrayUnaccessData(pArray);
SafeArrayDestroy(pArray);
方法三:使用
SafeArrayA
llocDescriptor
和
SafeArrayAllo
cData
在堆上创建二
维数组
SAFEARRAY* pArray=NULL;
HRESULT
hr=SafeArrayAllocDescriptor(2,&pArray);
pArray->rgsabound[0].lLbound=0;
pArray->rgsabound[0].cElements=3;
pArray->rgsabound[1].lLbound=0;
pArray->rgsabound[1].cElements=3;
pArray->cbElements=sizeof(long);
hr=SafeArrayAllocData(pArray);
long lDimension[2];
long x=1;
//
为第一行赋值
for(long i=0;i<3;++i)
{
lDimension[1]=0;//
行
<
/p>
lDimension[0]=i;//
列
SafeArrayPutElement(pArray,lDimension
,&x);
x++;
}
//
为第二行赋值
for(long i=0;i<3;++i)
{
lDimension[1]=1;//
行
<
/p>
lDimension[0]=i;//
列
SafeArrayPutElement(pArray,lDimension
,&x);
x++;
}
//
读取
SafeArray
中第二行第三列的数据
long y(0);
lDimension[1]=1;
lDimension[0]=2;
SafeArrayGe
tElement(pArray,lDimension,&y);
SafeArrayDestroy(pArray);
<
/p>
二维
SAFEARRAY
数组使用的时候
下标要注意
,
这里采用的是列主序的方式
,
即
lDimension[1]
代
表行,
lDimension[0]
代表列。
< br>
方法四:使用
SafeArrayCreate
在堆上创建一
维数组
SAFEARRAYBOUND Bound[1];
Bound[0].lLbound=0;
Bound[0].cElements=10;
SAFEARRAY*
pArray=SafeArrayCreate(VT_I4,1,Bound);
long* pData=NULL;
HRESULT
hr=SafeArrayAccessData(pArray,(void**)&pData);
long Low(0),High(0);
SafeArrayGetLBound(pArray,1,&Low);
SafeArrayGetUBound(pArray,1,&High);
-
-
-
-
-
-
-
-
-
上一篇:英语翻译话题词汇:历史文化类(二)
下一篇:两岸IT常用术语对照表