• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > [求助]在STL中,C++如何用Safearray类型传递vector<string>变量

[求助]在STL中,C++如何用Safearray类型传递vector<string>变量

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了 [求助]在STL中,C++如何用Safearray类型传递vector<string>变量等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: [求助]在STL中,C++如何用Safearray类型传递vector<string>变量
描述:

接口的变量类型是SAFEARRAY**,函数体中用vector<string>存储数据,如何把它转存在SAFEARRAY中。
比如我用vector<string> _files 存文件名
然后想把它存进 SAFEARRAY(BSTR)中
怎么存?
到时候又怎么取出?


解决方案1:

以前的贴子:
3 楼laiyiling(Graphics ◎ Multimedia)回复于 2004-10-19 13:21:22 得分 0 ZT:   
    
  学会使用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),否则会出错的。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • [求助]在STL中,C++如何用Safearray类型传递vector<string>变量

相关文章

  • 2017-06-05 得到一个进程的句柄后,怎样再把该进程设置为最高?
  • 2017-06-04 如何单步调试ATL编写的Windows服务呢?
  • 2017-06-04 VC写的组建的发布
  • 2017-06-04 关于adsi取信息的问题
  • 2017-06-04 com数据就真难搞,懂的帮看看
  • 2017-06-05 在一个程序中使用100个线程过多吗?
  • 2017-06-04 欢迎大家来看看哦,这里是新生带!!!
  • 2017-06-05 如何注册DLL库,让VBS可以CreatObject该库,然后使用该库提供的方法
  • 2017-06-04 ATLcom中多线程程序崩溃折腾3天了郁闷
  • 2017-06-04 /embedding和/automation选项有什么区别阿

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 我想在COM组件中实现函数重载,但IDL文件不让我用同一函数名,应该怎么办?
    • 急问高手关于客户端捕获不到atl做的服务器Error""抛出异常的问题!
    • 求高手:关于释放Dll的问题
    • 请问一下,谁有BeauGauge的设计器能不能帮忙设计几个控件!还有一些问题想请教yix
    • 事务问题-我在COMVC++一个接口中打开两个数据库,系统提示远程系统事务不可用---向高手求助!!
    • 关于调试DLL的问题
    • 组件中的Dialog上,怎么画出网格状的曲线图,在图上响应WM_MOUSEMOVE消息,当鼠标落在曲线上时,显示曲线的(X,Y)值。
    • ActiveX注册报错,错误代码0x80040201
    • ATL写控件,编译为非Debug版本就无法运行
    • 关于COM在ASP中调用的问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有