学会使用SafeArray

学会使用SafeArray

学会使用SafeArray也是很重要的,因为在ADO编程中经常要用。它的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型等信息。SafeArray也并不单独使用,而是将其再包装到VARIANT类型的变量中,然后才作为参数传送出去。在VARIANTvt成员的值如果包含VT_ARRAY|...,那么它所封装的就是一个SafeArray,它的parray成员即是指向SafeArray的指针。SafeArray中元素的类型可以是VARIANT能封装的任何类型,包括VARIANT类型本身。

 

使用SafeArray的具体步骤:

 

方法一:

包装一个SafeArray

l         定义变量,如:

 

VARIANT varChunk;
SAFEARRAY 
* psa;
SAFEARRAYBOUND rgsabound[
1 ];

 

 

l         创建SafeArray描述符:

rgsabound[ 0 ].cElements  =  nLength; //  nLength是元素个数
rgsabound[ 0 ].lLbound  =   0 ; // SafeArrayCreate三个参数分别是:数据类型,数组维数,数据长度和起始下标
psa  =  SafeArrayCreate(VT_UI1, 1 ,rgsabound);

 

l         放置数据元素到 SafeArray
一个一个地放,挺麻烦的。

for  ( long  i  =   0 ; i  <  nLength; i ++ )
    {
       
if  (FAILED(SafeArrayPutElement (psa,  & i, pBufEx ++ )))
           MessageBox(NULL,
" 出毛病了。 " , " 提示 " ,MB_OK  |  MB_ICONWARNING);
    }


l         封装到VARIANT内:

varChunk.vt  =  VT_ARRAY | VT_UI1;
varChunk.parray 
=  psa;

 

这样就可以将 varChunk 作为参数传送出去了。

读取SafeArray中的数据的步骤:

l         SafeArrayGetElement一个一个地读

BYTE buf[lIsRead];
for ( long  index = 0 ;index
{ 
SafeArrayGetElement(varChunk.parray,
& index,buf + index); 
}

 

就读到缓冲区buf里了。

方法二:

使用SafeArrayAccessData直接读写SafeArray的缓冲区:

l         读缓冲区:

BYTE  * buf;
SafeArrayAccessData(varChunk.parray, (
void   ** ) & buf);
f.Write(buf,lIsRead);
SafeArrayUnaccessData(varChunk.parray);

 

l         写缓冲区:

BYTE  * buf;
SafeArrayAccessData(psa, (
void   ** ) & buf);
for ( long  index = 0 ;index < UISREAD;INDEX ++ )
buf[index]
= bVal[index];
SafeArrayUnaccessData(psa);
varChunk.vt 
=  VT_ARRAY | VT_UI1;
varChunk.parray 
=  psa;

 

这种方法读写 SafeArray 都可以,它直接操纵 SafeArray 的数据缓冲区,比用 SafeArrayGetElement SafeArrayPutElement 速度快。特别适合于读取数据。但用完之后不要忘了调用 SafeArrayUnaccessData(psa) ,否则会出错的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值