聚合模型的要点 外部对象 创建内部对象的时候,外部对象必须把自己的 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 • 实现自定义接口的代理 /存根组件