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

为每一类COM服务器创建新进程,com,Com,我创建了outproc COM服务器,它实现了ClassA和ClassB。这两个类的工厂都在CoreRegisterClassObject(REGCLS\u SINGLEUSE、CLSCTX\u LOCAL\u服务器)中注册 当客户端应用程序调用CoCreateInstance(ClassA)时,系统将创建我的COM服务器的进程。当客户端应用程序再次调用CoCreateInstance(ClassA)时,系统会创建我的COM服务器的附加进程。但当客户端应用程序调用CoCreateInstance

我创建了outproc COM服务器,它实现了ClassA和ClassB。这两个类的工厂都在CoreRegisterClassObject(REGCLS\u SINGLEUSE、CLSCTX\u LOCAL\u服务器)中注册

当客户端应用程序调用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参数,并仅在CoRegisterClassObject出现时调用它。

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

如果创建ClassA类型的对象,将放弃在此过程中对此类工厂的注册。如果您再次请求ClassA,则必须启动一个新进程

但ClassB可能仍然拥有首次启动流程工厂的有效注册

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


创建一个对象时,您可以使用CoRevokeClassObject注销其他类。

从技术上讲,您可以在ClassA的工厂中调用CoRevokeClassObject来删除ClassB的工厂。不过,这很有意思,而且迟早会出错,因为您似乎有多个客户端。考虑您可以为服务器提供命令行参数,以指示需要创建类或类的工厂。并修改两个LocalServer32注册表项以提供该参数。@带有LocalServer32注册表项的HansPassant方法非常有效。谢谢请创建“官方”答案,以便我可以接受。只需告诉我们你在自己的帖子中做了什么,并接受它作为答案。