C++ 进程外COM服务器-每个调用进程一个服务器进程?

C++ 进程外COM服务器-每个调用进程一个服务器进程?,c++,com,com-server,C++,Com,Com Server,我有一个进程外com服务器,将CLSCTX_LOCAL_server指定为上下文,将REGCLS_MULTIPLEUSE指定为连接类型。这导致单个服务器进程被来自多个客户端的多个调用重用 我现在想对服务器进行一些更改,不幸的是,它不能与客户端之间共享的单个进程一起工作(这是有原因的,但它们太冗长了)。我知道您可以将服务器设置为使用REGCLS_SINGLEUSE作为连接类型,这将为OOP服务器的每次调用创建一个新进程。这解决了我的问题,但就流程使用而言,这是不可能的;在短时间内多次调用会导致许多

我有一个进程外com服务器,将CLSCTX_LOCAL_server指定为上下文,将REGCLS_MULTIPLEUSE指定为连接类型。这导致单个服务器进程被来自多个客户端的多个调用重用

我现在想对服务器进行一些更改,不幸的是,它不能与客户端之间共享的单个进程一起工作(这是有原因的,但它们太冗长了)。我知道您可以将服务器设置为使用REGCLS_SINGLEUSE作为连接类型,这将为OOP服务器的每次调用创建一个新进程。这解决了我的问题,但就流程使用而言,这是不可能的;在短时间内多次调用会导致许多进程,并且此特定服务器可能会经常受到攻击

有人知道混合这两种连接类型的机制吗?本质上,我想要的是每个调用进程都有一个服务器进程。(即,客户机1创建一个进程,该进程将重新用于来自该客户机的后续调用。客户机2尝试调用服务器,并创建一个新进程)。我怀疑我可以通过强制一个REGCLS_SINGLEUSE服务器在客户机中保持永久打开来实现这一点,但这既不优雅也不可能(因为我无法更改其中一个客户机)

想法

更新 正如所料,似乎没有办法做到这一点。如果时间和资源允许,我很可能会将其转换为进程内解决方案。不过现在,我不得不接受任何呼叫客户使用的新行为。幸运的是,这种变化的影响非常小,客户可以接受。稍后,我将研究更剧烈和适当的变化

注意 我已经将Hans的回答标记为答案,因为它实际上为维护OOP解决方案的问题提供了解决方案。我只是没有能力实施它


cal

COM不支持此激活方案。它应该包含在进程内服务器中,鉴于它的主要优势,请确保这不是您想要的方式

使用REGCLS_SINGLEUSE是另一种选择,但这需要扩展对象模型,以避免现在创建的大量服务器实例。
应用程序
coclass是样板方法。为它提供工厂方法,为您提供现有接口的实例


我将提到一种完全不同的方法,当我想解决同样的问题时,我也使用了这种方法,但需要一个进程外服务器来弥补比特率差距。您不必为COM启动服务器进程,客户机也可以启动它。当然,前提是它足够了解服务器的安装位置。现在,客户机当然可以完全控制服务器实例。服务器使用更改的CLSID调用了CoRegisterClassObject(),我将guid的一部分与进程ID异或。客户端也这样做,因此它始终与正确的服务器连接。客户机中需要额外的代码,以确保它等待足够长的时间,使服务器有机会注册其对象工厂。工作正常。

COM不支持此激活方案。它应该包含在进程内服务器中,鉴于它的主要优势,请确保这不是您想要的方式

使用REGCLS_SINGLEUSE是另一种选择,但这需要扩展对象模型,以避免现在创建的大量服务器实例。
应用程序
coclass是样板方法。为它提供工厂方法,为您提供现有接口的实例


我将提到一种完全不同的方法,当我想解决同样的问题时,我也使用了这种方法,但需要一个进程外服务器来弥补比特率差距。您不必为COM启动服务器进程,客户机也可以启动它。当然,前提是它足够了解服务器的安装位置。现在,客户机当然可以完全控制服务器实例。服务器使用更改的CLSID调用了CoRegisterClassObject(),我将guid的一部分与进程ID异或。客户端也这样做,因此它始终与正确的服务器连接。客户机中需要额外的代码,以确保它等待足够长的时间,使服务器有机会注册其对象工厂。运行良好。

因此,您希望在不使用过程的情况下获得过程中解决方案的所有好处。是这样吗?因为你所描述的,每个进程一个(该术语中的“proc”)正是它所做的,只有进程隔离是缺少的成分。到目前为止(它是遗留代码),我没有发现任何迹象表明它确实需要脱离进程,就我个人而言,我会在proc中实现它。不幸的是,这种变化的规模并不能证明在改变这样的事情时所需的测试是合理的。现在,我正在将新的行为添加到OOP上,并接受它稍微改变了旧的客户端行为。@cal,最好的解决方案是Hans提到的应用程序类。因此,您希望在不在进程中的情况下获得进程内解决方案的所有好处。是这样吗?因为你所描述的,每个进程一个(该术语中的“proc”)正是它所做的,只有进程隔离是缺少的成分。到目前为止(它是遗留代码),我没有发现任何迹象表明它确实需要脱离进程,就我个人而言,我会在proc中实现它。不幸的是,这种变化的规模并不能证明在改变这样的事情时所需的测试是合理的。目前,我正在将新的行为添加到OOP中,并接受它稍微改变了旧的客户端行为。@cal,最好的解决方案是Hans提到的应用程序类。REGCLS_SINGLEUSE基本上是一个非