为每个COM服务器类创建新进程

时间:2017-09-12 08:49:14

标签: com

我创建了outproc COM服务器,它实现了ClassA和ClassB。这两个类的工厂都使用CoRegisterClassObject(REGCLS_SINGLEUSE,CLSCTX_LOCAL_SERVER)注册。

当客户端应用程序调用CoCreateInstance(ClassA)时,系统会创建COM服务器的进程。当客户端应用程序再次调用CoCreateInstance(ClassA)时,系统会创建我的COM服务器的其他进程。但是当客户端应用程序调用CoCreateInstance(ClassB)系统不创建新进程时,它使用已经创建的。所以两个类在同一个过程中工作。

有没有办法强制系统为每个COM服务器类创建新进程?

解决方案(感谢Hans Passant):

在注册COM服务器期间,我只需在处理路径中添加其他参数。现在它看起来像这样:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{ClassX_CLSID}\LocalServer32]
@="C:\\Path\\Server.exe -ClassX"

当进程开始时,我在命令行中查找-ClassX params并仅在它出现时调用CoRegisterClassObject。

1 个答案:

答案 0 :(得分:0)

问题是您的COM服务器启动并注册它支持的所有类工厂。因此,应用程序启动并注册ClassA和ClassB的类工厂。

如果创建ClassA类型的对象,则会丢弃此进程中此类工厂的注册。如果您再向ClassA发出请求,则必须启动新进程。

但是ClassB可能仍然对首次启动的流程的工厂进行有效注册。

所以REGCLS_SINGLEUSE意味着一个类的单独使用。如果您有更多注册课程,则每个课程可以使用一次。

在创建一个对象时,我使用CoRevokeClassObject取消注册其他类。