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

时间:2010-05-28 11:55:51

标签: c++ com multithreading

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

在当前正在执行的线程中,还是在其主线程上?

3 个答案:

答案 0 :(得分:2)

遵守正常的COM公寓线程规则。如果对象是由STA公寓中的客户端创建的,则客户端线程需要使用封送的接口指针,否则它将获得RPC_E_WRONG_THREAD。实际的方法调用将在其STA线程中的服务器上执行,它需要为此工作提供一个消息循环。执行是序列化的,不需要锁定。

如果它存在于MTA公寓中,则方法调用将在任意RPC工作线程上执行。而且你需要采取通常的线程预防措施。

答案 1 :(得分:1)

线程不会从进程跳转到进程。

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

答案 2 :(得分:1)

请参阅Inter-Object CommunicationProxyStub

  

客户端始终调用接口   某些进程内对象中的方法。如果   实际的对象是本地的或远程的,   调用代理对象,   然后进行远程操作   打电话给实际的对象。

     

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

     

代理对象打包了   某些数据中的函数参数   数据包并生成一个RPC调用   本地或远程对象。那   数据包由存根对象拾取   在服务器的本地进程中   或打开包装的远程计算机   参数并拨打电话   该方法的真正实现。   当该函数返回时,存根   打包任何输出参数和   返回值并将其发送回   代理,解包并返回   他们是原来的客户。

     

因此,客户端和服务器总是交谈   彼此好像一切都是   在进程。