繁体   English   中英

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

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

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

我现在想对服务器进行一些更改,不幸的是,这些更改无法与客户端之间共享的单个进程一起使用(这是有原因的,但长期以来一直存在)。 我知道您可以将服务器设置为使用REGCLS_SINGLEUSE作为连接类型,这将为OOP服务器的每个调用创建一个新进程。 这解决了我的问题,但是对于流程使用而言却是一个入门者。 短时间内的多次呼叫会导致许多进程,并且可能经常难以置信地击中该特定服务器。

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

有什么想法吗?

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

注意我已将Hans的答复标记为答案,因为实际上确实可以解决维护OOP解决方案的问题。 我只是没有能力执行它。

COM不支持此激活方案。 它应该由进程内服务器覆盖,请确保鉴于其相当大的优势,这不是您要执行的操作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM