C++ 进程外COM服务器-函数调用和线程

C++ 进程外COM服务器-函数调用和线程,c++,com,multithreading,C++,Com,Multithreading,当您有一个进程外COM服务器,并且从该服务器内的一个客户端从客户端内的线程X调用一个函数时,该函数如何在COM服务器中执行 在其当前执行的线程中,或在其主线程上执行?线程不会从一个进程跳到另一个进程 在COM服务器内部,COM侦听传入的方法调用,并有一个线程池(特定于此进程)来服务请求。请参阅,和 客户端总是调用接口 某些进程内对象中的方法。如果 实际对象是本地或远程对象, 对代理对象进行调用, 这就产生了一个远程过程 调用实际对象 那么实际执行的是什么方法呢? 答案是,只要有 调用进程外接口,

当您有一个进程外COM服务器,并且从该服务器内的一个客户端从客户端内的线程X调用一个函数时,该函数如何在COM服务器中执行


在其当前执行的线程中,或在其主线程上执行?

线程不会从一个进程跳到另一个进程

在COM服务器内部,COM侦听传入的方法调用,并有一个线程池(特定于此进程)来服务请求。

请参阅,和

客户端总是调用接口 某些进程内对象中的方法。如果 实际对象是本地或远程对象, 对代理对象进行调用, 这就产生了一个远程过程 调用实际对象

那么实际执行的是什么方法呢? 答案是,只要有 调用进程外接口, 实现了每个接口方法 通过代理对象。代理对象是 始终是一个正在运行的对象 代表被调用的对象。 这个代理对象知道 实际对象以本地或本地模式运行 远程服务器

代理对象打包了 某些数据中的函数参数 数据包并生成对的RPC调用 本地或远程对象。那个 数据包由存根对象拾取 在本地服务器上的服务器进程中 或者一台远程计算机,它可以解包 参数,并调用 该方法的实际实现。 当该函数返回时,存根 打包所有输出参数和 返回值并将其发送回 代理,它将它们解压缩并返回 将它们发送给原始客户

因此,客户机和服务器总是相互通信 彼此之间好像一切都很好 正在进行中


遵守正常的COM单元线程规则。如果该对象是由客户机在STA单元中创建的,那么您的客户机线程需要使用封送接口指针,否则它会得到错误的RPC_E___线程。实际的方法调用将在其STA线程中的服务器上执行,它需要泵送一个消息循环才能工作。执行是序列化的,不需要锁定


如果它位于MTA单元中,则该方法调用将在任意RPC工作线程上执行。您还需要采取通常的线程预防措施。

因此,开发人员必须使comm服务器中的代码具有线程安全性,或者系统已经对其进行了处理?这在COM服务器中是可配置的:您可以要求COM序列化所有请求,或者告诉COM您将处理多线程(例如,使用锁)而且请求不会被序列化。嗯,问题是关于进程外服务器,所以封送总是会发生。我认为您的答案与in-proc服务器更相关,尽管客户端和服务器的线程配置需要相同,以防止封送。