在COM中使用数组参数--概述

BGP路由聚合:自动聚合和手动聚合 路由聚合是指将多条具体的路由合并为一条聚合路由,以减少路由表的条目数。这种技术通过只向对等体发送聚合后的路由,而不发送所有的具体路由,来减小路由表的规模。同时,被聚合的路由如果发生路由振荡,也不再对网络造成影响,从而提高了网络的稳定性。 阅读详情

在COM中使用数组参数-概述

关键字:DCOM、数组、自定义类型、Marshal、SafeArray、ICollection

 

本文讲述在COM的接口中使用数组作为参数的三种方法。它们分别是:数组指针、SafeArray和ICollection。文章分析了各种方法的优缺点。本文的目的不是描述COM的基本原理和开发方法。为了能够更好的理解本文中的内容,读者需要具备基本的COM编程知识。

1      相关的基本概念

在COM中,如果对接口中方法的调用是跨套间的,就必须对所进行的调用进行序列化。序列化哪康氖鞘沟饔媚芄辉谡返奶准渲蟹⑸1疚牟淮蛩阆晗该枋鎏准浜托蛄谢睦砺郏龆砸婕暗降囊恍└拍罱兴得鳌?lt;/SPAN>

1.1     套间(Apartment)

在一个进程中可以包含多个套间,每个套间可以包含一个或多个线程[1]。包含单个线程的套间叫做单线程套间;包含多个线程的套间叫做多线程套间。在一个进程中最多可以包含一个多线程套间,但可以拥有0或多个单线程套间。每个使用COM的线程,无论是客户程序还是COM程序都要通过调用CoInitialize或CoInitializeEx函数进入套间,同时确定所在套间的类型。在进入套间之前不能使用COM功能,否则会导致错误结果。

1.2     序列化(Marshal)

在COM架构中调用者和被调用者如果在不同的套间,就不可以直接调用,而必须通过代理(Proxy)和占位(Stub)程序调用。代理程序和调用者在同一个套间中,而占位程序和被调用者在同一个套间中。代理程序模仿COM组件的行为,接受调用,而占位程序模仿调用者的行为发出调用。这样就可以保证调用是在同一个套间中进行了。代理和占位程序之间通过特定的网络通讯协议传递被调用的方法、参数和返回值。把调用转换成网络协议的过程叫做序列化(Marshal)。由于涉及到指针或数组类型的传递地址型的参数,序列化过程非常复杂,幸好我们有简单的方法可以生成效率还算不错的代理和占位程序。

对于指针类型,具体的指针地址是不重要的,关键是指针指向的内存中的数据。所以在传递指针类型的参数时,必须传递所指向的数据。对于数组类型数据也有类似的情况。如果存在双重或多重指针,情况就会变得更加复杂。

例如long*类型的参数。在序列化的时候代理程序把参数所指向的长整型值传递给占位程序,占位程序要为参数申请内存,然后把长整型的值存放到申请到的内存中,使用这个新的内存地址作为参数调用目标函数。在函数返回的时候,内存中的数据变化被占位程序传递回代理程序。代理程序把数据复制回调用者的内存,然后返回。如果指针所指向的数据不是单个的值,而是一块不定大小的内存,序列化时就要确定所要传递数据的长度。另外,在多重指针的情况下,要传递的就不是一块数据,而可能是多块数据段了。

在后面的讨论中,我们会详细地说明如何生成正确的代理和占位程序。

1.3     代理(Proxy)和存根(Stub)

COM通过代理和存根实现序列化功能。每个可能跨套间调用的接口都必须有相应的代理和存根程序。代理和存根程序是在同一个动态连接库中的。每个COM接口的设计者负责实现自己的代理和存根程序。一般情况下,代理和存根程序的代码可以通过一个叫做MIDL的工具自动生成的,我们要做的只是把它编译出来。

代理和存根的工作方式如下图:

代理的作用是在客户套间中“伪装”成COM对象,供客户程序调用。而存根的作用则是在COM对象所在的套间中“伪装”成客户程序,发出调用请求。代理和存根之间通过网络协议[2]交换调用请求和返回结果。

 

2      概述

在COM中使用数组可以使用三种方法:数组指针、SafeArray和ICollection。数组指针和我们熟悉的C/C++程序中传递数组的方法是相同的、SafeArray是VB中标准的存放数组的方法,也是Automation中的标准方法、ICollection方法是通过一个独立的COM对象传递数据。这三种方法各有优缺点,应该按照具体的需求决定使用哪种方法。

2.1     数组指针

数组指针是标准的C/C++中的数组参数传递方式。数组指针实际上就是数组元素序列化存放时的首地址。数组指针的操作非常简单,所以也是效率最高的传递方式。但是,这种方式不能够在VB中使用。数组指针可以传递一维数组,也可以传递多维数组。如果COM的客户端是VC++程序的话,这是最好的传递方式。

数组指针作为跨套间的调用参数时,需要进行marshal。所以,应该编译和注册proxy/stub。

2.2     SafeArray

SafeArray是标准的VB数组存放方式。和数组指针类似,SafeArray可以传递一维数组,也可以传递多维数组。由于SafeArray具有比数组指针更复杂的结构,所以,编程比使用数组指针复杂[3],程序运行效率也相对较低。

使用SafeArray方式传递的数组,可以从VB程序中调用,也可以从VC++程序中调用。而且,由于SafeArray是Automation的标准数据,所以可以通过缺省的基于TLB的proxy/stub进行跨套间的调用,而不必编译和注册自己的proxy/stub。

2.3     ICollection

ICollection方式是最复杂,也是使用最广泛的。ICollection并不是一个接口的名称,而是指实现了枚举器和索引属性的IDispatch接口。这种数组传递方式的特点是自己实现数组对象,所以有最大的灵活性,可以实现按需生成数组元素等高级功能。

ICollection所传递的数组对象不再是普通的指针或特定的结构,而是一个独立的COM对象。由于传递的是接口,所以参数具有面向对象的多态性特征,就是说数组元素可以是自己实现的,也可以是其他人实现的,只要是实现了有特定属性的IDispatch接口就可以作为参数。另一方面,由于用作数组的COM对象可以单独设计,所以,可以使用更加合理的实现方式,例如使用列表、hash表或平衡树等方式实现。

有的数组实现,只需要访问少数的几个元素,或者元素个数理论上是无穷的,或者每个数组元素的生成需要耗费大量的资源。这时,应该使用ICollection方式实现数组传递。

3      各种方法的比较

 

数组指针

SafeArray

ICollection

代码量

少

较少

大

兼容Automation

不兼容

兼容

兼容

开发工具

VC++

VC++/VB

VC++

可重用性

低

低

高

按需生成元素

不可

不可

可

模型设计难度

容易

容易

难

程序运行速度

快

较慢

根据实际情况分析

分布式应用

RPC

RPC

RPC或对象复制

设计灵活性

尚可

尚可

高

 



[1] 最新的COM标准中,某些线程可能会跨越套间,这里不讨论这种情况。

[2] 实际上基于在远程过程调用协议(RPC)的一种协议。

[3] 指用VC++编程,如果用VB实现COM,这是唯一的传递方式。

十九、帧间预测编码_2、解码、显示顺序与图像管理、参考帧管理 一、基本概念 1.1H.264的解码顺序和显示顺序: 解码过程中,每一帧的数据按照相应的NAL Unit在码流中的顺序传入解码器进行解码 由于B帧的存在,视频帧在输出时会进行顺序重排 1.2frame_num与POC frame_num:表示解码顺序 POC:表示显示顺序(picture_order_count) 在H.264的码流中,表示解码顺序和显示顺序分别有相应的语法元素表示。这两个值都会在码流中保存,并在读取slice信息时解析(SliceHeader中) 1.3参考帧列表 某一帧图像在解 阅读详情

相关推荐

基于ROS与Gazebo的多机器人三角形编队仿真实践

本文详细介绍了基于ROS与Gazebo的多机器人三角形编队仿真实践,从环境搭建到编队控制的全过程。通过TurtleBot3机器人模型和TF坐标系系统,实现三个机器人的三角形编队控制,适用于机器人协同作业与编队算法研究。

weixin_29313817的博客 187

JS判断table中相同名称的数量总和是否等于100

var tbl = $("#table");//获取表格 Com_Parameter.event["submit"].push(function(){ var obj = {}; //循环表格中的每一行 tbl.find('tr').each(function(i,v){ var name = $(this).find("input[name='name']").val().trim(); var count = $(this).find("input[name='count']").val().

咏絮 590

卷王问卷考试系统——测试报告

本问卷考试系统是一款在线平台,支持用户发布和完成调查问卷,并进行考试管理,核心功能在于简化问卷创建发布、数据收集及考试组织流程。此次测试将围绕其关键模块展开,涵盖用户注册登录、项目列表、我的练习以及我的题库等核心部分。问卷考试系统(一)硬件环境普通办公电脑(CPU:Intel i5 、内存:16GB 、硬盘:512GB )(二)软件环境操作系统:Windows 11 ;浏览器:Chrome(版本 120+)、Firefox(版本 115+)、Edge(版本 120+)验证界面信息在完整性、一致性、准确性和用

m0_73433755的博客 556

COM组件,字符串数组的传递

前阵子做作业,需要用到COM。在ATL下开发简单的COM组件很简单,唯一的难点在于复杂参数的传递。比如说字符串数组,需要学习SAFFARRAY,bstr以及VARIANT的用法。     下面贴出代码,展示一个字符串数组如何传递。     在COM组件的方法里面: STDMETHODIMP CwordCountService::analyzeTheWordFile(BSTR file

wwxie123的博客 2645

LTspice导入德州仪器SPICE模型的实用指南与常见问题解析

本文详细介绍了如何在LTspice中导入德州仪器的SPICE模型,包括模型文件获取、路径管理、导入步骤及常见问题解析。通过实用指南帮助工程师精确仿真电路性能,提升设计效率,重点涵盖了第三方模型的导入教程和最佳实践。

kk1234的博客 313

避坑指南:中国地面气候日值数据集(V3.0)处理中的常见错误与解决方案

本文详细解析了中国地面气候日值数据集(V3.0)处理中的常见错误与解决方案,包括数据清洗、特征值解码、时间序列处理和质量控制等关键步骤。通过Python实战代码示例,帮助研究者高效处理这一包含全国699个气象站多要素日值数据的数据集,避免常见陷阱,提升气候变化研究和农业气象分析的准确性。

xray4的博客 1027

在COM中使用数组参数-数组指针 (转)

在COM中使用数组参数-数组指针 (转)[@more@]在COM中使用数组参数-数组指针 关键字:DCOM、数组、自定义类型、Marshal、SafeArray、ICollection 1 使用数组指针 数组指针使用标准...

cuiji1279的博客 271

舵机操作手册

微型伺服马达原理与控制(中鸣) 1、微型伺服马达内部结构一个微型伺服马达内部包括了一个小型直流马达;一组变速齿轮组;一个反馈可调电位器;及一块电子控制板。其中,高速转动的直流马达提供了原始动力,带动变速(减速)齿轮组,使之产生高扭力的输出,齿轮组的变速比愈大,伺服马达的输出扭力也愈大,也就是说越能承受更大的重量,但转动的速度也愈低。 2、微行伺服马达的工作原理一个微型伺服马达是一个典型闭环反馈系统,其原理可由下图表示: 减速齿轮组由马达驱动,其终端(输出端)带动一个线性的比例电位器作位置检测,该电位器把

HEIMENGER的博客 3137

COM中参数标识

jadeshu的博客 670

Xilinx SDK调试与FPGA硬件验证全流程解析

本文详细解析了从Vivado导出硬件到Xilinx SDK进行调试与FPGA硬件验证的全流程。重点阐述了正确导出包含bitstream的硬件平台、创建合适的SDK工程、配置Debug会话以编程FPGA,并介绍了串口验证、自定义IP测试以及使用ILA进行软硬件联合调试的高级技巧,帮助开发者高效完成FPGA系统的软硬件协同开发与问题排查。

weixin_28327051的博客 311

Gromacs GPU加速版安装全攻略:从依赖配置到性能优化

本文提供了Gromacs GPU加速版的完整安装与性能优化指南。详细介绍了从编译器、OpenMPI、FFTW到CUDA等关键依赖的配置,手把手指导编译支持CUDA的Gromacs,并深入解析了如何通过调整.mdp参数及平衡MPI与OpenMP线程分配,最大化GPU利用率,从而让分子动力学模拟效率获得数十倍提升。

y9z0a1b的博客 1151

在COM中使用数组参数

关键字:DCOM、数组、自定义类型、Marshal、SafeArray、ICollection  本文讲述在COM的接口中使用数组作为参数的三种方法。它们分别是:数组指针、SafeArray和ICollection。文章分析了各种方法的优缺点。本文的目的不是描述COM的基本原理和开发方法。为了能够更好的理解本文中的内容,读者需要具备基本的COM编程知识。1 相关的基本概念 在COM

在水一方 7797

【光子AI 2026 企业级 Agent 架构指南】别再把 Skill 当 Tool:Agent Skills × MCP 企业级落地全指南(最新定义澄清 + 场景大全 + 选型决策树+安全工程清单)

摘要: 2026年企业级AI架构迎来两大核心标准——Agent Skills与MCP(Model Context Protocol),分别解决流程标准化与系统集成难题。Agent Skills通过“文件夹化能力包”(SOP+脚本+模板)固化专家流程,确保输出一致性;MCP则以类USB-C的协议统一外部系统接入,降低集成成本。两者差异显著:Skills专注程序性知识(如财报生成),MCP侧重动态连接(如跨平台数据调用)。实际场景中,复杂需求(如智能客服)需组合使用——MCP为骨架提供连接能力,Skills为大

AI天才研究院 2477

在COM中使用数组参数-概述

countrysight的专栏 204

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

在COM中使用数组参数-数组指针

在COM中使用数组参数-数组指针关键字:DCOM、数组、自定义类型、Marshal、SafeArray、ICollection1      使用数组指针数组指针使用标准的C/C++数组表示方式。数组中的每个元素按照顺序在内存中依次排放。数组的下标从0开始计算。数组的第一个元素(下标为0的元素)的地址就是数组的指针,数组中每个元素所占的内存空间大小必须是固定的,只和数组类型有关。计算数组

Nelson Chen的专栏 1855

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

在COM中使用数组参数-ICollection

在COM中使用数组参数-ICollection关键字:DCOM、数组、自定义类型、Marshal、SafeArray、ICollection1      使用ICollectionICollection是从 IDispatch继承的接口。ICollection还需要一个IEnumVARIANT接口配合实现功能。IEnumVARIANT是从IUnknown继承的,而不是从IDispatc

Nelson Chen的专栏 2888

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

在COM中使用数组参数-SafeArray

在COM中使用数组参数-SafeArray 关键字:DCOM、数组、自定义类型、Marshal、SafeArray、ICollection 1     使用SafeArray SafeArray是VB中的数组存储方式。通过SafeArray,可以在VC 和VB间相互safearrai 可以存储调用。SafeArray也是Automation中的标准数组存储方式。 1.1    SafeAr

joy1688的专栏 1220

[转]在COM中使用数组参数-SafeArray

[转]在COM中使用数组参数-SafeArray 来源:http://www.7880.com/Info/Article-5208abe0.html 1 使用SafeArray SafeArray是VB中的数组存储方式。通过SafeArray,可以在VC++和VB间相互调用。SafeArray也是Automation中的标准数组存储方式。 1.1 SafeArray处理函数 COM提供了

Nikiev的专栏 1380

关于《在COM中使用数组参数》的提醒

网文《在COM中使用数组参数》被广为转载,下面就是其中一个:http://blog.youkuaiyun.com/wcyoot/article/details/6562620 。 该文讲述在COM的接口中使用数组作为参数的三种方法。它们分别是:数组指针、SafeArray和ICollection。就其中的数组指针,该文中说“数组指针的操作非常简单,所以也是效率最高的传递方式。但是,这种方式不能够在VB中使用

brook的专栏 655

C# 传递数组参数到 COM && COM 返回数组到 C#

string []dropFiles = {“”, “”, “”}

835

COM参数如何传递数组

好象很少情况会在com的参数中用到数组。但有时候数组确实也会有它的方便之处。特别是变体数组可以存放不同的数据类型,特别的方便。(还有就是传递不定数目的参数时,可利用变体数组,非常有用)比如现在有一堆数据需要进行处理,处理的分支条件是数据的类型。VB中的调用代码:dim var1,var2ReDim var1(3)var1(0) = CInt(10) 整型需要*10var1(1) = CL

石头记 2216

jacob传送数组到com以及从com的提取com对修改后的数组参数

import com.jacob.com.*;   import com.jacob.activeX.*;   public class Exam_6   {    public static void main(String[] args)    {    ActiveXComponent pp = new ActiveXComponent("PrjCOM.MyCOM");    ...

哦嘛咪嘛咪哄~~~ 585
上一篇: 使用ATL建立支持IClassFactory2的COM组件
下一篇: 在COM中使用数组参数-SafeArray
nelsonc
博客等级 码龄26年 1粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值