Multithreading “做公寓”;“生活”;在out process环境中是在服务器端还是在客户端?

Multithreading “做公寓”;“生活”;在out process环境中是在服务器端还是在客户端?,multithreading,winapi,com,atl,apartments,Multithreading,Winapi,Com,Atl,Apartments,我很难理解outprocess环境中的COM单元 基本上,我不明白为什么客户端需要调用CoInitializeEx来在单元中注册自己的线程。 我可以理解服务器线程和STA或MTA中的服务器线程使用的对象。但我不明白客户为什么要关心这件事 每个文档/指南都说客户必须致电CoInitializeEx才能在公寓中注册。这是否意味着服务器会跟踪客户端的线程? 或者单元数据也在客户端进程上分配?跟踪线程的不是服务器,而是COM将线程连接到特定单元。客户端拥有线程,所以创建STA或MTA是客户端的选择 一旦

我很难理解outprocess环境中的COM单元

基本上,我不明白为什么客户端需要调用
CoInitializeEx
来在单元中注册自己的线程。 我可以理解服务器线程和STA或MTA中的服务器线程使用的对象。但我不明白客户为什么要关心这件事

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

跟踪线程的不是服务器,而是COM将线程连接到特定单元。客户端拥有线程,所以创建STA或MTA是客户端的选择

一旦客户机为线程选择了所需的单元模型,COM将决定如何准确地满足某些调用。如果COM类注册为仅在MTA中运行,并且客户端的threda是STA,那么COM的任务就是在辅助MTA线程上创建实际对象,并将其接口封送到客户端的STA中


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

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

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

我建议您阅读MSDN的COM指南部分,以便更好地了解哪一个是什么以及它们是如何相互关联的