学会使用SafeArray

来源:互联网 发布:中国博士论文数据库 编辑:程序博客网 时间:2024/05/23 19:20

学会使用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),否则会出错的。

 

原创粉丝点击