COM多线程模型、DCOM 潘爱民 http://www.icst.pkuedu.cn/compcourse
COM多线程模型、DCOM 潘爱民 http://www.icst.pku.edu.cn/compcourse
内容 复习:COM聚合和COM跨进程模型 COM线程模型 分布式 COMDCOM) DCOM基本结构 对象激活 连接管理 并发管理 DCOM安全模型
内容 • 复习:COM聚合和COM跨进程模型 • COM线程模型 • 分布式COM(DCOM) – DCOM基本结构 – 对象激活 – 连接管理 – 并发管理 – DCOM安全模型
复习:COM包容模型 对象B IOtherInterfacel 客户程序 调用 ISomelnterfacel 调用 对象A ISomelnterface
复习:COM包容模型 对象 B ISomeInterface 对象 A ISomeInterface 客户程序 调用 调用 IOtherInterface
复习:聚合,支持聚合的对象 在非聚合方式下的接口示意图 对象A 委托 IUnknown 客户程序 QueryInterface ISomelnterfacel Add Ref Release Some Function 非委托 IUnknown
对象 A ISomeInterface 客户程序 QueryInterface AddRef Release SomeFunction 委托 IUnknown 非委托 IUnknown 复习:聚合,支持聚合的对象 在非聚合方式下的接口示意图
复习:聚合,支持聚合的对象 在聚合方式下的接口示意图 对象B QueryInterface 外部对象的 AddRef IUnknown IOtherlntelface Release Other Function 控制 客户程序 对象A 委托 Querylnterface UNKnown AddRef ISomeInterfacel 非委托 Somefunction IUnknown
复习:聚合,支持聚合的对象 在聚合方式下的接口示意图 对象 B IOtherInterface 对象 A ISomeInterface 客户程序 QueryInterface AddRef Release SomeFunction QueryInterface AddRef Release OtherFunction 外部对象的 IUnknown 委托 IUnknown 非委托 IUnknown 控制
聚合模型的要点 外部对象 创建内部对象的时候,外部对象必须把自己的 IUnknown接口指针传给内部对象 当外部对象接到对于聚合接口的请求时,它必须调用 非委托版本的 UNKnown的 QueryInterface函数,并把结 果返回给客户 内部对象 内部对象类厂的 Createlnstance必须检查 pUnkOuter参数 嵌套聚合:传递最外层的 pUnkOuter参数 除了非委托版本的 IUnknown之外,其他接口的 三个 Unknown调用必须全部委托给外部对象的 pUnkOuter
聚合模型的要点 • 外部对象 – 创建内部对象的时候,外部对象必须把自己的 IUnknown接口指针传给内部对象 – 当外部对象接到对于聚合接口的请求时,它必须调用 非委托版本的IUnknown 的QueryInterface函数,并把结 果返回给客户 • 内部对象 – 内部对象类厂的CreateInstance必须检查pUnkOuter 参数 – 嵌套聚合:传递最外层的pUnkOuter参数 – 除了非委托版本的IUnknown之外,其他接口的 三个IUnknown调用必须全部委托给外部对象的 pUnkOuter
通过类厂建立代理对象和组件对 象自定义列集过程 客户进程 组件进 客户 组件程序 ① Createlrhstance 类厂2LRCd类厂|类厂对象 更返 代理对象 存根代码 ⑥传输列集信息 ④创建 创建代 理对象 ⑤列集 件对 ⑩用 自定义代理 ⑧连接 组件对象 对象
通过类厂建立代理对象和组件对 象自定义列集过程 组件进程 组件程序 客户进程 类厂 代理对象 类厂 存根代码 类厂对象 自定义代理 组件对象 对象 客户 ④创建组 件对象 ① CreateInstance ②LPC/RPC ③调用 ⑤列集 ⑥传输列集信息 ⑦创建代 理对象 ⑨返回 ⑧连接 ⑩调用
自定义列集的要点 对象必须实现 Marshal接口 代理对象也必须实现 I Marshal接口,并且代 理对象与进程外对象之间协作 代理对象必须负责所有接口的跨进程操作 典型用途: 提高跨进程调用的效率,使用缓存状态等优化 技术 marshal-by-value
自定义列集的要点 • 对象必须实现IMarshal接口 • 代理对象也必须实现IMarshal接口,并且代 理对象与进程外对象之间协作 • 代理对象必须负责所有接口的跨进程操作 • 典型用途: – 提高跨进程调用的效率,使用缓存状态等优化 技术 – marshal-by-value
标准列集的 proxy和sb结构 客户进程 组件进程 客户程序 组件对象 代理对象 代理 存根代码 ITFI 存根 管理器 ITFI 管理器 中ITF2 O ITF2 中ITFn O ITIn IRpcProxy Buffer IRpcStub buffer RPC通道 RPC通道 IRpcChannelBufter 系统RPC 系统RC↓
标准列集的proxy和stub结构 客户进程 代理对象 组件进程 ITF1 客户程序 ITF2 ITFn 代理 管理器 IRpcChannelBuffer 系统 RPC 组件对象 存根代码 ITF1 ITF2 ITFn 存根 管理器 系统 RPC IRpcProxyBuffer IRpcStubBuffer RPC 通道 RPC 通道
进程外组件注意事项 自注册方式的变化 命令行参数/ ResErver和 UnregServer 注册类厂 何时被卸载 调用 Coinitialize和 CoUninitialize 实现自定义接口的代理/存根组件
进程外组件注意事项 • 自注册方式的变化 – 命令行参数/RegServer 和/UnregServer • 注册类厂 • 何时被卸载 • 调用CoInitialize 和CoUninitialize • 实现自定义接口的代理 /存根组件