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