c++学习笔记之安全数组

        当需要想数据库中插入一些较大的二进制数据文件时,通常会选择用安全数组来充当存储数据的媒介。

        百度百科中对安全数组的使用目的有更直接的描述,在网络环境中,数组不能直接传递,而将其封装成safearray后则可以,以下是百度百科里对安全数组的介绍:


         SAFEARRAY的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray。实质上SafeArray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元 素类型等信息。SafeArray也并不单独使用,而是将其再包装到VARIANT类型的变量中,然后才作为参数传送出去。在VARIANT的vt成员的 值如果包含VT_ARRAY|...,那么它所封装的就是一个SafeArray,它的parray成员即是指向SafeArray的指针。 SafeArray中元素的类型可以是VARIANT能封装的任何类型,包括VARIANT类型本身。 
  使用SafeArray的具体步骤:
  方法一:
  包装一个SafeArray:
  (1). 定义变量,如:
  VARIANT varChunk;
  SAFEARRAY *psa;
  SAFEARRAYBOUND rgsabound[1];
  (2). 创建SafeArray描述符:
  uIsRead=f.Read(bVal,ChunkSize);//read array from a file.
  if(uIsRead==0)break;
  rgsabound[0].cElements =uIsRead;
  rgsabound[0].lLbound = 0;
  psa = SafeArrayCreate(VT_UI1,1,rgsabound);
  (3). 放置数据元素到SafeArray:
  for(long index=0;index<uIsRead;index++)
  {
  if(FAILED(SafeArrayPutElement(psa,&index,&bVal)))
  ::MessageBox(NULL,"出毛病了。","提示",MB_OK | MB_ICONWARNING);
  }
  一个一个地放,挺麻烦的。
  (4). 封装到VARIANT内:
  varChunk.vt = VT_ARRAY|VT_UI1;
  varChunk.parray = psa;
  这样就可以将varChunk作为参数传送出去了。
  读取SafeArray中的数据的步骤:
  (1). 用SafeArrayGetElement一个一个地读
  BYTE buf[lIsRead];
  for(long index=0;index<lIsRead;index++)
  {
  ::SafeArrayGetElement(varChunk.parray,&index,buf+index);
  }
  就读到缓冲区buf里了。
  方法二:
  使用SafeArrayAccessData直接读写SafeArray的缓冲区:
  (1). 读缓冲区:
  BYTE *buf;
  SafeArrayAccessData(varChunk.parray, (void **)&buf);
  f.Write(buf,lIsRead);
  SafeArrayUnaccessData(varChunk.parray);
  (2). 写缓冲区:
  BYTE *buf;
  ::SafeArrayAccessData(psa, (void **)&buf);
  for(long index=0;index<uIsRead;index++)
  {
  buf=bVal;
  }
  ::SafeArrayUnaccessData(psa);
  varChunk.vt = VT_ARRAY|VT_UI1;
  varChunk.parray = psa;
  这种方法读写SafeArray都可以,它直接操纵SafeArray的数据缓冲区,比用SafeArrayGetElement和 SafeArrayPutElement速度快。特别适合于读取数据。但用完之后不要忘了调用::SafeArrayUnaccessData (psa),否则会出错的。
  如果SafeArray中存的是BSTR的二维数组,则代码如下:
  if(varChunk.vt = VT_ARRAY | VT_BSTR)
  {
  BSTR* buf;
  long LBound; // 数组下界
  long UBound; // 数组上界
  SafeArrayAccessData(varChunk.parray, (void **)&buf);
  SafeArrayGetLBound(varChunk.parray, 1, &LBound);
  SafeArrayGetUBound(varChunk.parray, 1, &UBound);
  for(long i = LBound; i < UBound; i ++)
  {
  CString str(buf);
  MessageBox(str);
  }
  SafeArrayUnaccessData(varChunk.parray);
  }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值