我创建了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。
答案 0 :(得分:0)
问题是您的COM服务器启动并注册它支持的所有类工厂。因此,应用程序启动并注册ClassA和ClassB的类工厂。
如果创建ClassA类型的对象,则会丢弃此进程中此类工厂的注册。如果您再向ClassA发出请求,则必须启动新进程。
但是ClassB可能仍然对首次启动的流程的工厂进行有效注册。
所以REGCLS_SINGLEUSE意味着一个类的单独使用。如果您有更多注册课程,则每个课程可以使用一次。
在创建一个对象时,我使用CoRevokeClassObject取消注册其他类。