1

我很难理解外部进程环境中的 COM 公寓。

基本上我不明白为什么客户需要打电话CoInitializeEx在公寓中注册它自己的线程。我可以理解服务器线程使用的对象以及 STA 或 MTA 中的服务器线程。但我不明白为什么客户应该关心这个。

每个文件/指南都说客户必须打电话CoInitializeEx才能在公寓中注册。这是否意味着服务器会跟踪客户端的线程?或者公寓数据也分配在客户端进程上?

4

2 回答 2

2

驻留在进程外服务器中的 COM 对象实际上由两部分组成 - 服务器中的实现代码和由编译器和 COM 运行时创建的 RPC 代理/存根代码。调用远程 COM 对象转换为对本地代理对象的调用,然后使用一些 RPC 机制来编组调用并将调用作为消息传输到服务器进程。消息由服务器中的存根选取,然后调用真正的 COM 对象并将结果编组回代理,然后代理将其解组并将其返回给调用客户端代码。从客户端和 COM 对象的角度来看,所有调用都是本地调用,即使像 DCOM 一样通过网络发生。

现在客户端中的代理的行为就像一个普通的 COM 对象,它必须驻留在某种公寓中。服务器中的 COM 对象也位于它自己的单元中。COM 允许客户端和服务器具有不同的线程模型并处理适当的同步(当两个互操作的代码位于不同的进程中时,这很容易)。

我建议您阅读 MSDN 上 COM 指南中的Process、Thread 和 Apartments部分,以更好地了解哪一个是什么以及它们是如何互连的。

于 2012-05-25T19:17:51.690 回答
1

跟踪线程不是服务器,它是 COM 将线程附加到某个单元。并且它是客户端拥有线程,因此创建STA或MTA是客户端的选择。

一旦客户端为线程选择了所需的单元模型,COM 将决定如何准确地满足某些调用。如果一个 COM 类注册为仅在 MTA 中运行,并且客户端的线程是 STA,那么 COM 负责在工作 MTA 线程上创建实际对象并将其接口编组到客户端的 STA 中。

客户端选择操作模式,COM 与服务器注册一起获取。

于 2012-05-25T18:28:01.920 回答