公寓是在服务器端还是在客户端“生活”在进程外环境中?
Posted
技术标签:
【中文标题】公寓是在服务器端还是在客户端“生活”在进程外环境中?【英文标题】:Do apartments "live" on the server side or on the client side in a out-process environment? 【发布时间】:2012-06-01 05:27:49 【问题描述】:我很难理解外部进程环境中的 COM 单元。
基本上我不明白为什么客户需要调用CoInitializeEx
在公寓中注册它自己的线程。
我可以理解服务器线程使用的对象以及 STA 或 MTA 中的服务器线程。但我不明白为什么客户应该关心这个。
每个文档/指南都说客户必须致电CoInitializeEx
才能在公寓中注册自己。这是否意味着服务器会跟踪客户端的线程?
或者公寓数据也分配在客户端进程上?
【问题讨论】:
【参考方案1】:驻留在进程外服务器中的 COM 对象实际上由两部分组成 - 服务器中的实现代码和由编译器和 COM 运行时创建的 RPC 代理/存根代码。调用远程 COM 对象转换为对本地代理对象的调用,然后该对象使用某种 RPC 机制来编组并将调用作为消息传输到服务器进程。消息由服务器中的存根选择,然后调用真正的 COM 对象并将结果编组回代理,然后代理将其解组并将其返回给调用客户端代码。从客户端和 COM 对象的角度来看,所有调用都是本地调用,即使像 DCOM 一样通过网络发生。
现在客户端中的代理的行为就像一个普通的 COM 对象,它必须驻留在某种公寓中。服务器中的 COM 对象也位于它自己的单元中。 COM 允许客户端和服务器具有不同的线程模型并处理适当的同步(当两个互操作的代码位于不同的进程中时,这很容易)。
我建议您阅读 MSDN 上 COM 指南的 Process, Thread, and Apartments 部分,以更好地了解哪一个是什么以及它们是如何互连的。
【讨论】:
【参考方案2】:跟踪线程不是服务器,它是 COM 将线程附加到某个单元。并且它是客户端拥有线程,因此创建STA或MTA是客户端的选择。
一旦客户为线程选择了所需的单元模型,COM 将决定如何准确地满足某些调用。如果一个 COM 类注册为仅在 MTA 中运行,并且客户端的线程是 STA,那么 COM 负责在工作 MTA 线程上创建实际对象并将其接口编组到客户端的 STA 中。
客户端选择操作模式,COM与服务器注册一起获取。
【讨论】:
以上是关于公寓是在服务器端还是在客户端“生活”在进程外环境中?的主要内容,如果未能解决你的问题,请参考以下文章
Windows 环境下的 Socket 编程 4 - 基于 UDP 的服务器/客户端