zoukankan      html  css  js  c++  java
  • 学会使用SafeArray

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

  • 相关阅读:
    [BestCoder Round #3] hdu 4907 Task schedule (模拟简单题)
    .NET中的PublicKeyToken以及强命名问题
    bug统计分析续(一)基于SQL的Bug统计方法
    iOS项目开发实战——通过Http Get方式与server通信
    TCP与UDP的区别(转)
    Telit GPRS模块测试报告
    GPRS优点介绍及GPRS上网相关知识(转)
    MC34063中文资料及应用实例(转)
    MC34063+MOSFET扩流 12V-5V 折腾出了高效率电路(转)
    Bluez SPP实现代码分析(转)
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330150.html
Copyright © 2011-2022 走看看