2024年3月21日发(作者:)
COM多线程模型、DCOM
潘爱民
/compcourse
复习:COM包容模型
对象
B
IOtherInterface
客户程序
调用
ISomeInterface
调用
对象
A
ISomeInterface
复习:聚合,支持聚合的对象
在聚合方式下的接口示意图
对象
B
QueryInterface
外部对象的
IOtherInterface
AddRef
IUnknown
Release
OtherFunction
控制
客户程序
对象
A
委托
QueryInterface
IUnknown
ISomeInterface
AddRef
Release
非委托
SomeFunction
IUnknown
内容
•复习:COM聚合和COM跨进程模型
•COM线程模型
•分布式COM(DCOM)
–DCOM基本结构
–对象激活
–连接管理
–并发管理
–DCOM安全模型
复习:聚合,支持聚合的对象
在非聚合方式下的接口示意图
对象
A
委托
IUnknown
客户程序
QueryInterface
ISomeInterface
AddRef
Release
SomeFunction
非委托
IUnknown
聚合模型的要点
•外部对象
–创建内部对象的时候,外部对象必须把自己的
IUnknown接口指针传给内部对象
–当外部对象接到对于聚合接口的请求时,它必须调用
非委托版本的IUnknown的QueryInterface函数,并把结
果返回给客户
•内部对象
–内部对象类厂的CreateInstance必须检查pUnkOuter 参数
–嵌套聚合:传递最外层的pUnkOuter参数
–除了非委托版本的IUnknown之外,其他接口的
三个IUnknown调用必须全部委托给外部对象的
pUnkOuter
1
通过类厂建立代理对象和组件对
象自定义列集过程
客户进程组件进程
客户组件程序
①
CreateInstance
类厂
②LPC/RPC
类厂
③调用
类厂对象
⑨返回
代理对象
存根代码
⑥传输列集信息
⑦创建代
④创建组
理对象
⑤列集
件对象
⑩调用
自定义代理
⑧连接
组件对象
对象
标准列集的proxy和stub结构
客户进程组件进程
客户程序
组件对象
代理对象
代理
存根代码
ITF1
存根
管理器
ITF1
管理器
ITF2
ITF2
ITFn
ITFn
IRpcProxyBuffer
IRpcStubBuffer
RPC
通道
RPC
IRpcChannelBuffer
通道
系统
RPC
系统
RPC
多线程特性
•Win32线程和COM线程
•marshaling和同步
•套间线程
•自由线程
•进程内组件的线程模型
自定义列集的要点
•对象必须实现IMarshal接口
•代理对象也必须实现IMarshal接口,并且代
理对象与进程外对象之间协作
•代理对象必须负责所有接口的跨进程操作
•典型用途:
–提高跨进程调用的效率,使用缓存状态等优化
技术
–marshal-by-value
进程外组件注意事项
•自注册方式的变化
–命令行参数/RegServer和/UnregServer
•注册类厂
•何时被卸载
•调用CoInitialize和CoUninitialize
•实现自定义接口的代理/存根组件
进程和线程
•进程
–在Linux平台上,时间和空间概念的结合
–在Windows平台上,是个空间概念
•线程
–在Linux平台上,一个执行环境
–在Windows平台上,也是一个调度单元,是
个时间概念
2


发布评论