做公寓"生活"在进程外环境中的服务器端或客户端?

时间:2012-05-25 15:55:59

标签: multithreading winapi com atl apartments

我很难在外部环境中了解COM公寓。

基本上我无法理解为什么客户需要调用CoInitializeEx在公寓中注册自己的线程。 我可以理解生活在STA或MTA中的服务器线程和服务器线程使用的对象。但我无法理解为什么客户应该关注这一点。

每个文档/指南都说客户必须致电CoInitializeEx在公寓中注册。这是否意味着服务器会记录客户端的线程? 或者公寓数据也是在客户流程上分配的?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

跟踪线程不是服务器,它是COM连接线程到某个公寓。它是拥有线程的客户端,因此客户可以选择创建STA或MTA。

一旦客户为线程选择了所需的公寓模型,COM将决定如何完全满足某些呼叫。如果注册的COM类仅在MTA中运行,并且客户端的threda是STA,那么COM的工作就是在工作者MTA线程上创建实际对象并将其接口编组到客户端的STA中。

客户选择操作模式,COM将所有操作与服务器注册结合在一起。