1

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

我现在想对服务器进行一些更改,不幸的是它不能与客户端之间共享的单个进程一起使用(这是有原因的,但它们很啰嗦)。我知道您可以将服务器设置为使用 REGCLS_SINGLEUSE 作为连接类型,这将为 OOP 服务器每次调用创建一个新进程。这解决了我的问题,但在流程使用方面并非首发;短时间内多次调用会导致许多进程,并且这个特定的服务器可能会被频繁地击中。

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

想法?

更新 正如预期的那样,似乎没有办法做到这一点。如果时间和资源允许,我很可能会将其转换为 In-Proc 解决方案。不过,就目前而言,我不得不采用用于任何呼叫客户端的新行为。幸运的是,这种变化的影响非常小,客户可以接受。稍后我将研究更剧烈和适当的更改。

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

卡路里

4

1 回答 1

5

COM 不支持这种激活方案。它应该由进程内服务器覆盖,请确保这不是您想要的方式,因为它具有相当大的优势。

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

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

于 2014-01-23T17:54:57.743 回答