【问题标题】: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 才能在公寓中注册自己。这是否意味着服务器会跟踪客户端的线程? 或者公寓数据也分配在客户端进程上?

【问题讨论】:

    标签: multithreading winapi com atl apartments


    【解决方案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与服务器注册一起获取。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 2018-06-06
        • 2011-10-03
        • 1970-01-01
        相关资源
        最近更新 更多