ATL Internals 2ed复习.chapter 3.SAFEARRAY

本文介绍了COM编程中用于安全地在函数间传递数组的SAFEARRAY数据类型。详细解释了SAFEARRAY结构体成员及其作用,并提供了创建、读取及销毁SAFEARRAY的具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

A Review of the COM SAFEARRAY Data Type

为了在COM函数间传递Array参数,IDL定义了SAFEARRAY类型:

interface IMyInterface : IUnknown {       
    HRESULT GetArray([out,retval]         
        SAFEARRAY(VARIANT_BOOL)* myArray);
};                                        
typedef struct tagSAFEARRAY {     
    USHORT cDims;                 
    USHORT fFeatures;             
    ULONG cbElements;             
    ULONG cLocks;                 
    PVOID pvData;                 
    SAFEARRAYBOUND rgsabound[ 1 ];
} SAFEARRAY;                      

其中

cDims数组的维数

cbElements每一个元素的size

pvData指向真实数据

SAFEARRAYBOUND用于规定上下限:rgsabound[0]用于规定最左维,rgsabound[cDims-1]规定最右维

typedef struct tagSAFEARRAYBOUND {
    ULONG cElements;              
    LONG lLbound;                 
} SAFEARRAYBOUND;                 


创建Array例子:

SAFEARRAYBOUND rgsabound[2];
rgsabound[0].cElements = 3;
rgsabound[0].lLbound = 0;
rgsabound[1].cElements = 4;
rgsabound[1].lLbound = 0;
SAFEARRAY* psa = ::SafeArrayCreate(VT_R8, 2, rgsabound);

 

读取Array中数据例子:

long rgIndices[] = { 2, 1 };
double lElem;
::SafeArrayGetElement(psa, rgIndices, (void*)&lElem);

注意上面例子取得[1][2]的数据,

 

销毁Array应该使用:

::SafeArrayDestroy(psa);

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值