com之 代理(proxy)与存根(stub)

自己创建COM ProxyStub工程 <br />      在visual studio下,如果采用ATL模板编写COM进程外服务器(Local/Remote Server),编译器将自动生成ProxyStub(PS)的工程。利用IDL文件编译出来的相关文件可以直接编译链接成功。但是其中隐藏了很多的细节,本文从一个空的dll工程开始创建一个PS工程,并说明一下需要注意的细节。<br />      本文以《inside COM》中第十章"Servers in EXEs"中的代码为例。<br />      利用以下命令编译IDL文件serve 阅读详情

com之 代理(proxy)与存根(stub)

 

什么是代理和存根 ?

      

       打个比方,你到自动取款机上去取款;你就是客户,取款机就是你的代理;你不会在乎

钱具体放在那里,你只想看到足够或更多的钱从出口出来(这就是com的透明性)。你同银行之间的操作完全是取款机代理实现。  你的取款请求通过取款机,传到另一头,银行的服务器,他也没有必要知道你在哪儿取钱,他所关心的是你的身份,和你取款多少。当他确认你的权限,就进行相应的操作,返回操作结果给取款机,取款机根据服务器返回结果,从保险柜里取出相应数量的钱给你。你取出卡后,操作完成。  取款机不是直接同服务器连接的,他们之间还有一个“存根”,取款机与存根通信,服务器与存根通信。从某种意义上说存根就是服务器的代理。

图1 组件间通信

       如上图两个组件之间不是直接通信,而是通过代理和存根来之间的通信来间接实现的。图中的channel是com库的一部分。

       COM里,只有进程外组件才会用到代理(proxy)和存根(stub)。

       代理在客户的进程内创建,存根在组件com对象的进程中创建。 每个接口的每个函数都有自己的代理和存根。

 

为什么要用代理和存根 ?

      

       客户为什么要用代理和存根,而不直接同对象连接呢? 给你一个理由,对客户来说,他与所有com对象的连接都是通过指针来调用的, 而对服务来说,调用对象的接口函数也是通过指针来完成的,然而,指针只有在同一进程内才会有效。这样,代理和存根为了完成这个使命也就产生了。

       代理和存根的作用不只这些,他还要打包所有的参数(包括接口指针),产生 RPC(远程进程调用),通向另一个进程,或者对象运行所在的另一台机器。

 

图2  代理的结构

       上图所显示的代理结构支持参数的标准列集。每个接口的代理实现了IRpcProxyBuffer接口,用于内聚各个部分之间的相互通信。当代理准备把已列集的参数传递过进程边界时,他调用IRpcChannelBuffer 接口的方法(该接口由channel实现)。channel调用RPC运行库使数据传输到目的地。

图3 存根的结构

       如上图所示,每个接口的存根被连接到对象的相应接口上。chnnel分发传入的消息到适当的接口的存根。所有的组件通过IRpcChannelBuffer接口与chnnel交流,这个接口提供了与RPC运行库的连接。

 

列集(marshalling)

       说到代理和存根,自然少不了列集,什么是列集?

       列集,对函数参数进行打包处理得过程,因为指针等数据,必须通过一定得转换,才能被另一组件所理解,列集完成后,RPC调用就会产生。可以说列集是一种数据格式的转换方法。

列集有3种方式:

1. 类型库列集

       它可以列集与OLEAUTOMATION兼容的任何接口,意思是你的接口的返回值必须是HRESULT,所使用的参数的类型也应该是与C++的VARIANT结构兼容。

2. 通过创建Stub / proxy DLL

       这个DLL的源代由MIDL产生。你必须在服务器和客户机上都注册这个DLL(这是标准的marshal 方式)使用吃方法时,最好把stub / proxy代码编译作为一个独立的组件。

3. 自定义marshaling

       自定义marshal要求在你的组件中必须实现IMarshal接口。当COM需要marchal时,他首先通过QueryInterface看你是否支持IMarshal接口,如果你实现了该接口,也就是说,由你控制了你的COM的所有参数和返回值的打包、解包的方法模式。

 

代理和存根dll的建立

       使用工具MIDL,对一个IDL文件,MIDL会分析自动产生相应的代理/存根 DLL的相关文件。

怎么使用代理和存根

       对于你来说代理和存根的使用是透明的,你根本不用去关心如何使用他们,com库会知道怎么做。

      

    [ 注:本文中的图均取自MSDN ]

       欢迎你阅读此文,并留下宝贵的意见,讨论会让问题了解更加得深入,如果你要引用该文,请留下我的名字。 谢谢大家,共同进步。

COM组件开发实战:从接口定义到进程内外服务器实现 组件对象模型(COM)是Windows平台实现软件组件化与二进制重用的核心技术。其核心原理基于接口(Interface)与引用计数机制,通过定义清晰的二进制契约,实现了跨语言、跨进程的组件交互能力。这一技术价值在于彻底解决了DLL地狱问题,为Windows生态提供了稳定的组件集成基础。在应用场景上,COM广泛支撑了从系统API、Office自动化到DirectX图形接口等关键领域。本文以实战为导向,通过手把手构建一个完整的数学计算组件,深入解析了进程内(DLL)与进程外(EXE)两种服务器的实现细节,并涵盖 阅读详情

相关推荐

【ORB_SLAM系列4】—— 一文搞定如何在Ubuntu20.04中安装运行ORB_SLAM3(包含ROS版本和非ROS版本)

ORB-SLAM3是一款基于特征点的实时单目SLAM系统,是SLAM领域的研究热点之一。它的核心算法是结合了ORB特征点提取和描述子匹配、单目RGB相机的深度估计、运动估计和地图优化等步骤,能够在实时性和精度之间取得平衡,适用于各种环境下的定位和建图任务。在各种应用领域都有广泛的应用。本教程主要是介绍了关于在ubuntu20.04中运行ORB_SLAM3的所有依赖的库的安装过程,和所遇到的一些报错的解决方法。有什么问题,可以评论区里面交流讨论

2401_82458959的博客 5039

理解AIDL中的Stub与Stub.Proxy

参考: 理解Aidl中Stub和Stub.Proxy 存根类(stub) 是什么意思?有什么作用?

yzpbright的博客 3104

在 SAP 资产模块跨 2024 和 2025 两个年度操作后,运行 AFAB 测试无数据,大概率是折旧已完全过账、跨期配置异常或资产数据异常等原因

SAP资产模块跨年度操作AFAB测试无数据的排查方案:首先检查折旧是否已完全计提,确认资产主数据价值;其次验证跨年度配置是否合规,包括全局配置、折旧范围和账期状态;然后重新执行AFAR折旧计算刷新数据;排查资产主数据异常或业务操作冲突;最后核对AFAB运行参数是否正确设置,包括会计年度、期间范围和运行模式等。

金牌架构师 866

COM 代理存根模式下COM组件的实现和加载

       呵呵,多年没有搞COM相关的东西,这次由于公司项目的需要又重新学习了COM中与项目相关的部分技术,不过COM技术还是博大精深,敝人也是初探皮毛。本BLOG是对在代理/存根模式下COM组件调用的方法与兄弟们探讨一下。希望能对大家有所帮助。      COM组件对外输出接口有两种模式:TLB库((Type Library)模式和代理/存根(Proxy/stud)模式。如果COM组件是通过TLB库模式输出的时候,将会生成一个.tlb文件,这种方法客户端调用也方便(直接导入即可),同时支持跨语言开发和

liufx的专栏 1387

黑猫带你学eMMC协议第12篇:生产状态感知(PSA)

1 概述 1.1 什么是PSA Production State Awareness (PSA) 生产状态感知 e•MMC设备可以利用其是否在生产环境中的信息,从而在现场运作时进行不同的操作。 例如,在设备低温焊接(soldering)前,将数据写入emmc,可能导致数据出错,而正在焊接期间写入数据,出错的概率可能会更大。在低温焊接之前,emmc设备可以使用一种特定的内部操作去加载内容,这样就能减少数据出错的概率,而在低温焊接后进行常规的操作就行了。 1.2 psa如何进行工作? PSA存在于emmc5.0

黑猫奥利奥的博客 4262

生成模型实战 | MuseGAN详解与实现

人工智能音乐生成领域已引起了广泛关注,MuseGAN 是其中一个重要的模型。本节我们将使用 JSB Chorales 数据集来训练 MuseGAN,该数据集包含巴赫创作的四音轨合唱曲。在生成图像时,生成器使用的是来自潜在空间的单一噪声向量来生成不同格式的内容;而在 MuseGAN 中,生成器将使用四个噪声向量来生成一段音乐,旨在增强音乐生成过程中的可控行和多样性。每个噪声向量代表音乐的不同方面,通过单独调整这些向量,模型可以生成更复杂、更细腻的音乐作品。

盼小辉丶的博客 6586

Proxy-Stub模式分析

一.说明 Stub 跟 Proxy 是一对,俗称“代理-桩”,一般用在远程方法调用。 Proxy 相当于是拿在手里的遥控器,而 Stub 相当于长在电视机里的遥控接收器,它们有着一一对应的接口方法,但操作的方向刚好相反。 Proxy 的接口供客户端程序调用,然后它内部会把信息包装好,以某种方式(比如 RMI)传递给 Stub,而后者通过对应的接口作用于服务端系统,从而完成了“远程调用”。

有心好书 9833

STM32F103C8T6驱动DHT11温湿度传感器程序

本程序基于 STM32F103C8T6 微控制器,通过 GPIO 模拟单总线通信时序实现对 DHT11 温湿度传感器的数据采集,主机采用拉低数据线的方式触发传感器启动,并通过检测高电平持续时间区分逻辑“0”和“1”,依次读取湿度和温度的整数数据及校验位,经过校验后将有效结果存入缓存数组,实现对环境温湿度的周期性测量与处理。

加斯顿工程师的博客 201

DCOM揭秘

http://www.pcdog.com/p/html/2004927/27920042820_1.htm Distributed COM --跨网络工作  DCOM代表的是“Distributed(分布式)”COM。在前面的部分中,我们已经讲解了运行在同一部计算机的COM客户和服务器。在这一部分,我们将讨论如何将它扩展到DCOM的领域和分布式计算。   大多数的COM编程者仅使用本地的“进程内”

天道酬勤 6624

llama2-7b下载并转llama-2-7b-hf

④输入https://github.com/huggingface/transformers/blob/main/src/transformers/models/llama/convert_llama_weights_to_hf.py会下载 convert_llama_weights_to_hf.py 文件,我们需要用到这个文件将llama2-7b转成llama-2-7b-hf。③下载完之后是这四个文件,这里我是在windows操作系统中安装的WSL,没有linux操作系统,没办法。

wenling54321的博客 1031

嵌入式面试题精选100道及参考答案(4万字长文)

指针是C语言中一种特殊的变量,它存储的是另一个变量的内存地址。指针的使用提供了一种间接访问和操作内存的方法。地址操作:通过使用运算符,可以获取变量的地址,并将这个地址赋值给指针变量。间接引用:使用运算符可以访问指针指向的变量的值。动态内存分配:指针用于动态地分配和释放内存。数组操作:指针可以用于遍历和操作数组。函数参数:指针作为函数参数可以改变原始数据。字符串操作:在C语言中,字符串通常以字符数组的形式存在,并通过字符指针进行操作。// 指向数组的第一个元素i < 5;++i) {在这个例子中,

大模型大数据攻城狮的专栏 1973

com之代理(proxy)与存根(stub)

com之代理(proxy)与存根(stub) 什么是代理和存根 ?   打个比方,你到自动取款机上去取款;你就是客户,取款机就是你的代理;你不会在乎钱具体放在那里,你只想看到足够或更多的钱从出口出来(这就是com的透明性)。你同银行之间的操作完全是取款机代理实现。 你的取款请求通过取款机,传到另一头,银行的服务器,他也没有必要知道你在哪儿取钱,他所关心的是你的身份,和你取款多少。当他确认你的权

malei8197的专栏 1352

基于单片机的智能体重秤设计与嵌入式程序实现

智能体重秤的基本功能是测量用户的体重,并将数据通过无线方式传输到终端设备(如智能手机、电脑或云平台)进行管理。体重测量:实时测量用户体重,并进行数据存储。BMI(体质指数)计算:基于体重和身高计算BMI值,帮助用户了解健康状况。多用户管理:通过蓝牙或Wi-Fi技术支持多用户体重数据记录。健康数据分析:结合历史数据分析体重变化趋势。语音播报:通过语音播报用户体重,便于老人或视力不便的人士使用。数据同步:通过App或云平台同步数据,进行长期健康监控。

2201_76125393的博客 1757

com之代理(proxy)与存根(stub) [转]

什么是代理和存根 ?          打个比方,你到自动取款机上去取款;你就是客户,取款机就是你的代理;你不会在乎钱具体放在那里,你只想看到足够或更多的钱从出口出来(这就是com的透明性)。你同银行之间的操作完全是取款机代理实现。  你的取款请求通过取款机,传到另一头,银行的服务器,他也没有必要知道你在哪儿取钱,他所关心的是你的身份,和你取款多少。当他确认你的权限,就进行相应的操作,返回

狂人山庄 1485

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

什么是代理和存根 ?

打个比方,你到自动取款机上去取款;你就是客户,取款机就是你的代理;你不会在乎钱具体放在那里,你只想看到足够或更多的钱从出口出来(这就是com的透明性)。你同银行之间的操作完全是取款机代理实现。  你的取款请求通过取款机,传到另一头,银行的服务器,他也没有必要知道你在哪儿取钱,他所关心的是你的身份,和你取款多少。当他确认你的权限,就进行相应的操作,返回操作结果给取款机,取款机根据服务器返回结果,

Neo的专栏 1692

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

COM线程模型概要

1. 套间机制 套间(Apartments)的类型 STA用于单线程,MTA用于多线程。而NTA则被称为线程无关(Thread-Neutral)的多线程 2.跨套间(Cross-Apartment),Proxy/Stub Proxy(代理)总是在客户端,而Stub(存根)则是在服务器端 Marshalling/UnMarshalling 即将COM对象转为网络流和将网络...

weixin_38169359的博客 136

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ATL 调度(Marshaling)

调度(Marshaling): 进程和计算机之间进行函数参数和返回值传输的一个过程。 核心: proxy / stub (代理 / 存根) 当需要实现调度时,COM在客户程序进程地址空间创建一个proxy对象, 在组件的地址空间创建一个stub对象。 客户程序与proxy交互,就像客户机和组件之间存在直接连接一样 组件与stub交互,就像组件与客户程序之间存在之间连接一样 这...

weixin_33717117的博客 120

代理(proxy)与存根(stub)

COM中的stub:http://dev.youkuaiyun.com/article/20/20783.shtmhttp://comcamp.myrice.com/techarticles/vc/0005.htm在测试中,stub有时意思是"打桩程序"(应该是被植入的意思),但是在com里面还都是作存根解。RMI中的stub:http://www.nihaoblog.com/143_2154.htmlhtt

x.Chin 2344

COM代理与存根

<br />什么是代理和存根 ?<br /> <br />打个比方,你到自动取款机上去取款;你就是客户 ,取款机就是你的代理 ;你不会在乎 <br />钱 具体放在那里,你只想看到足够或更多的钱从出口出来(这就是com的透明性)。你同银行之间的操作完全是取款机代理实现。 你的取款请求通过取款机,传到另一头,银行的服务器,他也没有必要知道你在哪儿取钱,他所关心的是你的身份,和你取款多少。当他确认你的权限,就进行相应 的操作,返回操作结果给取款机 ,取款机根据服务器返回结果,从保险柜里取出相应数

lcfeng1982的专栏 1680

什么是代理和存根

URL: http://zxjgoodboy.blog.sohu.com/74249273.html什么是代理和存根 ?             打个比方,你到自动取款机上去取款;你就是客户,取款机就是你的代理;你不会在乎钱具体放在那里,你只想看到足够或更多的钱从出口出来(这就是com的透明性)。你同银行之间的操作完全是取款机代理实现。  你的取款请求通过取款机,传到另一头,银

woyaowenzi的专栏 2773

Android AIDL proxy/stub 分析

AIDL的作用 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象。在Android平台,一个进程通常不能访问另一个进程的内存空间,所以要想对话,需要将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界。 通过代码来实现这个数据传输过程是冗长乏味的,Android提供了AIDL工具来处理这项工作。 AIDL (Android Interface Definition Language) 是一种IDL 语言,...

转载和创作优秀的博客 759

com类工厂中的clsid为1365a45f_COM编程攻略(十三 列集细节,代理,桩(存根))...

上一篇介绍了关于COM套间的相关概念:Froser:COM编程攻略(十二 套间Apartment)​zhuanlan.zhihu.com本篇介绍其具体实现原理。PS: 这篇文章大概写了一个星期,其中有一部分内容只是理论上正确,但是执行起来有些问题,这一部分文章中会明确说明,没有这样明确说明的部分,其执行是完全没有问题的。所以这部分只需要理解就好了,如果有哪位知道怎么解决,请在评论区告诉我。一、列集...

weixin_42118056的博客 352

有不是dll的com,也有不是com的dll 对吗

有不是dll的com,也有不是com的dll 对吗

xie__jin__cheng的博客 386
上一篇: COM 之 com 初谈
下一篇: com之套间(Apartment)
shudingbo
博客等级 码龄25年 37粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值