来自同一用户帐户的LocalServer32 EXE的COM激活是否共享现有进程?
当客户端应用程序调用c_com_ptr :: CreateInstance(使用ATL包装器)时,我启动了一个COM服务器LocalServer32 EXE。
在Windows 7上,当在同一用户帐户下运行的第二个客户端应用程序也调用c_com_ptr :: CreateInstance时,将启动在同一用户帐户下运行的EXE的第二个副本。在过去的生活中,我的印象是第二个客户将分享第一个EXE。
是否共享了LocalServer32进程?什么时候或什么时候不?谷歌搜索答案给我一个巨大的噪音信号比,我找不到答案。
我的CLSID注册表项具有LocalServer32值,提供EXE路径,ProgID,可编程(空字符串),TypeLib(GUID)和VersionIndependentProgId。我有一个AppID密钥。
我不想将EXE作为服务运行,我不介意该进程不共享。我只是想知道规则,所以我知道会发生什么(在Windows Server 2003之后。)
编辑:在下面的Chris回答之后,我检查了服务器中的CoRegisterClassObject调用。我正在使用ATL,并且我覆盖MyServer :: RegisterClassObjects以挂接到CAtlExeModuleT :: RegisterClassObjects的调用链,并看到ATL正在使用CLSCTX_LOCAL_SERVER和REGCLS_MULTIPLEUSE。
将此更改为CLSCTX_LOCAL_SERVER和REGCLS_SINGLEUSE会导致启动更多进程,具体取决于客户端创建的COM对象的数量,如预期的那样。
仍然,回到REGCLS_MULTIPLEUSE,每个COM客户端进程得到一个COM服务器进程,每个服务器进程包含其客户端的所有COM对象,如预期的那样,除非两个COM客户端在同一个用户帐户下运行,它们各自得到自己的服务器,这不是我理解REGCLS_MULTIPLEUSE。
区别在于客户端本身实际上是Windows服务吗? (它们是。)当作为用户帐户运行的Windows服务进程在REGCLS_MULTIPLEUSE下创建COM对象时,这是否被区别对待,导致观察到的行为?为什么我会获得多个流程? (只是为了澄清,我不希望我的COM服务器作为Windows服务运行,但使用它的客户端确实作为Windows服务运行。)
此外,将客户端作为本地系统或网络服务运行,REGCLS_MULTIPLEUSE按我的预期工作:只启动单个COM服务器EXE进程。当COM客户端是在用户帐户下运行的Windows服务时,将启动多个进程。
没有找到相关结果
已邀请:
2 个回复
博沮富教全
臂哦