耗尽流程com服务器 - 每个呼叫过程一个服务器进程

Out of Process COM Server - One server process per calling process?

本文关键字:服务器 过程 进程 一个 呼叫 com      更新时间:2023-10-16

我有一个逐步的com服务器,将clsctx_local_server指定为上下文,而连接类型的regcls_multiperuse。这导致多个客户端的多个调用重复使用单个服务器进程。

我现在想对服务器进行一些更改,不幸的是,该服务器无法与客户之间共享的单个过程使用(有原因是这样做的原因,但它们却很长)。我知道您可以将服务器设置为使用REGCLS_SINGLEUSE作为连接类型,这将为每个调用的OOP服务器创建一个新的过程。这解决了我的问题,但在流程使用方面是不开始的。短期内多次调用会导致许多过程,并且该特定服务器可能经常被击中。

有人碰巧知道混合这两种连接类型的机制吗?从本质上讲,我想要的是每个调用过程的单个服务器过程。(即客户端一个人创建一个过程,并且该过程被重复使用该客户端的后续调用。客户端两个尝试调用服务器,并创建一个新的过程)。我怀疑我可以通过强迫rengcls_singleuse服务器在客户端永久打开,但这既不优雅也不可能(因为我无法更改一个客户端)。

想法?

更新正如预期的那样,似乎没有办法这样做。如果允许时间和资源,我很可能会将其转换为程序内解决方案。但是,目前,我必须处理任何用于任何呼叫客户端的新行为。幸运的是,这种变化的影响非常小,客户可以接受。

,我将调查更加急剧和适当的更改。

注意我将汉斯的答复标记为答案,因为它实际上确实为维持OOP解决方案的问题提供了解决方案。我只是没有能力实施它。

cal

com不支持此激活方案。它应该由程序中的服务器覆盖,请确保在其相当优势的情况下,这不是您想做的方式。

使用REGCLS_SINGLEUSE是替代方案,但这需要您扩展对象模型以避免现在创建的服务器实例的风暴。Application镜是样板方法。为其提供工厂方法,使您可以实现现有接口的实例。

我将提到一种截然不同的方法,当我想解决相同的问题时使用的方法,但是需要 以利用弥合点差距。您不会遇到com为您启动服务器流程,客户端也可以启动它。当然,它对服务器的安装位置有足够的了解。现在,客户当然可以完全控制服务器实例。该服务器称为CoreGisterClassObject(),带有更改的CLSID,我将GUID的一部分与流程ID隔离。客户端执行了相同的操作,因此它始终与正确的服务器连接。客户端需要额外的代码,以确保其等待时间足够长,以使服务器有机会注册其对象工厂。效果很好。