公寓是在进程外环境中"live"在服务器端还是在客户端?



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

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

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

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

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

我建议您阅读 MSDN 上 COM 指南的进程、线程和单元部分,以更好地了解哪一个是什么以及如何互连。

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

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

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

最新更新