使用SafeArray问题

 

摘自:http://topic.csdn.net/t/20040704/12/3144244.html

 

  学会使用SafeArray也是很重要的,因为在ADO编程中经常要用。它的主要目的是用于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[index])))  
        ::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[index]=bVal[index];      
    }  
    ::SafeArrayUnaccessData(psa);  
   
    varChunk.vt   =   VT_ARRAY|VT_UI1;  
    varChunk.parray   =   psa;  
   
  这种方法读写SafeArray都可以,它直接操纵SafeArray的数据缓冲区,比用SafeArrayGetElement和SafeArrayPutElement速度快。特别适合于读取数据。但用完之后不要忘了调用::SafeArrayUnaccessData(psa),否则会出错的。  

 

再补充两个  
  1.#include   <comutil.h>  
  #pragma   comment(   lib,   "comsupp.lib"   )    
  VARIANT   v1;  
  char   * buf   =   _com_util::ConvertBSTRToString((_bstr_t)v1);    
  2. VARIANT   variant_inp;BYTE   bt;CString   csRes,csByte;int   len;  
  COleSafeArray   safearray_inp=variant_inp;  
  len=safearray_inp.GetOneDimSize(); for(k=0;k<len;k++)  
  {  
  safearray_inp.GetElement(&k,rxdata+k);  
  m_RecFrameArray_All.Add(rxdata[k]);  
  bt=m_RecFrameArray_All.ElementAt(k);  
  csByte.Format("%02x   ",bt);//这具体的格式要看你存放是是什么类型的  
  csRes+=csByte;  
  }  
  csRes.TrimRight();  
  char   *pstr=cs.GetBuffer(csRes.GetLength());  
  csRes.ReleaseBuffer();

CByteArray   m_RecFrameArray_All;BYTE   rxdata[2048];    
  上面也可以从rxdata直接向char   *转换,这种方法处理不同进制比较好,容易用BYTE分开

 

 

转载于:https://www.cnblogs.com/gre-grass/archive/2008/10/21/1315989.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值