1、概念
(1)代理和存根
代理和存根在COM,RPC等方面使用。
列集marshaling
列集,对函数参数进行打包处理得过程,因为指针等数据,必须通过一定得转换,才能被另一组件所理解,列集完成后,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库会知道怎么做。
(2)COM
(3)RPC
RPC(Remote Procedure Call,远程过程调用)一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地资源一样,通过网络传输去访问远端系统资源。(此段百度的,不管来自哪儿,弄明白就是自己的)
类厂(类工厂)
c++下,创建对象必须知道对象的类别,然后才能比如new一个出来。
而com下,你不知道组件的实际的类别,你只知道abstract class,也就是com接口,所以你不能创建。
但是客户并不关心实际的类别,只关心接口,
所以有必要引入一个间接的创建机制,让它来创建,这就是类厂,这是通用的设计模式。
2、问题:COM的RPC为什么一定要使用Proxy和Stub?不能像Socket一样直连客户端和服务器吗?
在COM架构中调用者和被调用者如果在不同的套间,就不可以直接调用,而必须通过代理(Proxy)和占位(Stub)程序调用,通过Proxy和Stub之间的通讯来完成调用者和被调用者之间的调用,
即:`Server -- Stub -- Network --- Proxy --- Client`,
我的疑问是直接通过`Server -- Network --- Client`能实现吗?为什么一定要使用Proxy和Stub?
客户为什么要用代理和存根,而不直接同对象连接呢?
给你一个理由,对客户来说,他与所有com对象的连接都是通过指针来调用的, 而对服务来说,调用对象的接口函数也是通过指针来完成的,然而,指针只有在同一进程内才会有效
。这样,代理和存根为了完成这个使命也就产生了。
代理和存根的作用不只这些,他还要打包所有的参数(包括接口指针),产生RPC(远程进程调用),通向另一个进程,或者对象运行所在的另一台机器。
回答1【采用】
原因1:COM要实现位置透明性
RPC是指远程过程调用,COM之所以要用Proxy/Stub,而不用WinSocket等通信手段直接通信是因为COM要实现位置透明性
,即客户不需要知道服务器在哪。
原因2:封装需要
另一个重要原因是因为封装需要
,客户如果和服务器直接通信,那么他们之间就得建立一个协议,指明参数的传递格式,用什么加密手段加密,公钥是什么等,这有违服务器的封装性,而且也留有严重的安全隐患(因为会话是由客户和服务器共同建立的,而客户和服务器并不是同一组织编写,客户方可以留下漏洞),而使用Proxy/Stub,Proxy和Stub都是编写服务器的组织编写的,留下漏洞的原因就只能是那个组织水平有限。
回答2
楼主的意思可能是用COM来通讯为什么不是和Socket通讯一样直接连接而要通过代(Proxy)和(Stub)
COM在这里应该认为是DCOM最后也是要走Socket的,只是这些DCOM都帮你做好了,所以你不用自己写一个Socket来RPC一下,他让你感觉服务器就在本机上一样。
不是说COM不能做Socket,用COM和做Socket没有什么关系。
回答3
我说得很清楚了,数据当然是靠RPC来传的
但是只有代理/存根dll知道把传来的数据包unmarshal成什么东西
如果没有proxy/stub
那么server怎么知道client传来的是什么东西,同样client也不知道server传来的是什么东西
参考:
https://www.jianshu.com/p/d93d0a11f556
https://bbs.csdn.net/topics/30442941