学会使用SafeArray

本文介绍了在 ADO 编程中如何使用 SafeArray 进行数组型参数的传递。SafeArray 是一种在网络环境中传递数组的方式,通过增加描述符来说明数组的维数、长度等信息。文章详细讲解了创建和封装 SafeArray 的步骤,并提供了两种读写 SafeArray 的方法。

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

学会使用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的数据缓冲区,比用SafeArrayGetElementSafeArrayPutElement速度快。特别适合于读取数据。但用完之后不要忘了调用SafeArrayUnaccessData(psa),否则会出错的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值