• 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 > 如何快速高效率的得到SAFEARRAY的一部分

如何快速高效率的得到SAFEARRAY的一部分

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

佚名通过本文主要向大家介绍了safearray,safearray inp,vlax make safearray,vlax safearray,vlax safearray fill等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 如何快速 高效率的得到SAFEARRAY的一部分
描述:

有一个SAFEARRAY* saf1,
含有10000个short型整数,
如何快速而且高效率的得到前1000个short
并且用前1000个short生成一个新的SAFEARRAY* saf2,
我要做很多次这个操作,所以希望有一种高效率的方法,谢谢!


解决方案1:

我以 VT_UI1 | VT_ARRAY 这种类型的 VARIANT 为例,你可以容易改为你想要的:
VARIANT Rec_Data = m_MSComm.GetInput(); //GetInput返回VARIANT类型数据
ASSERT((VT_UI1 | VT_ARRAY) == Rec_Data.vt);
int Data_Len = Rec_Data.parray->rgsabound->cElements; //注意 Data_Len 可能要乘以数据宽度,比如 short 型就要乘以 2
memcpy(CommDataBuff, Rec_Data.parray->pvData, Data_Len); //CommDataBuff 为 BYTE 型数组

解决方案2:

下面是一个例子,至于效率,你还想怎样提高?
                    SAFEARRAY *varSeriesChildren=...;
                    VARIANT ASeriesChild;
                    VariantInit(&ASeriesChild);
                    long lLow=0;
                    long lHigh=0;
                    SafeArrayGetLBound(varSeriesChildren,1,&lLow);
                    SafeArrayGetUBound(varSeriesChildren,1,&lHigh);                    
                    for(long ix=lLow;ix<=lHigh;ix++)
                    {
                        hr = SafeArrayGetElement(varSeriesChildren, &ix, &ASeriesChild);
                        if(FAILED(hr))
                        {
                            printf("SafeArrayGetElement for child %d failed.\n",ix);
                            exit(-1);
                        } 
                  
                        ...
                    }            
                    
                    hr = SafeArrayDestroy(varSeriesChildren);
                    if(FAILED(hr))
                    {
                        printf("SafeArrayDestroyfailed.\n");
                    }

解决方案3:

使用智能指针CComSafeArray<short>可以方便访问元素,但是效率是无法提高的,本质都得依靠SafeArray的API来访问

解决方案4:

直接把你的数据集合封装成COM对象,传递接口而不是数据
和C里面传递数组的引用是一个道理

解决方案5:

为什么要用SAFEARRAY,直接用数组不是效率更高?
http://blog.csdn.net/zhoujianhei 
博客好像挂了。??

解决方案6:

SAFEARRAY 只要顺序访问就行了, 效率最高,因为本质上SAFEARRAY也就是数组,


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

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

  • 关于SAFEARRAY的释放问题,高手请进
  • VCCOM组件想通过一个事件传递一个Safearray数组如何传递?
  • 请问SAFEARRAY怎么操作?
  • 简单问题一个标准函数SafeArrayGetElement,不知道什么意思
  • [VC->VB@DLL]如何给SAFEARRAY类型的参数传值?
  • 在vc中使用SAFEARRAY的问题??急,大侠们一定要帮帮忙啊!!!!
  • 关于safeArray使用的问题,在线等待,解决给分。
  • 高手帮我看看,关于安全数组(SafeArray)使用问题
  • 关于SAFEARRAY数组的释放问题
  • 自定义类型的SafeArray创建

相关文章

  • 2017-06-05 动态链接库高手接分!编写嵌套DLL问题!急!!
  • 2017-06-05 问个线程与回调函数的问题
  • 2017-06-04 VC编程向outlook2003中循环写入联系人,写到一定数量程序总是出错,请高手帮忙解决,多谢!
  • 2017-06-04 怎样写IE的插件啊?
  • 2017-06-05 (分不够可以加)请问:在主程序中调用导出函数得到了dll中一个类的指针,可以访问这个类的成员函数或变量吗
  • 2017-06-05 消息队列和消息循环有什么区别?(斑竹请进)
  • 2017-06-05 关于线程的启动和停止
  • 2017-06-05 如何改变一个系统服务的状态?系统服务高人请进
  • 2017-06-04 做OLE拖放的时候怎么知道拖进来的是不是"我的电脑"这种特定对象呢?
  • 2017-06-04 VC++-》shell-》IShellExtInitandIShellPropSheetExt的开发中的问题

文章分类

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

最近更新的内容

    • 在VC怎样根据dll文件生成相应的lib库文件,用libexe吗,盼指教!
    • win7中如何获取管理员权限
    • 我用vc写了一个OCX控件,请问如果在WEB上使用
    • 关于VCIFormulaOneWorkbook
    • 请教dll中多线程问题
    • 关于WTL消息反射的问题
    • 求教如何在vc60中使用windowssdkforvista
    • CString类的多线程问题
    • 不规则形状的ActiveX控件的问题
    • 如何判断机器上是否安装了Outlook

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

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