来自同一用户帐户的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服务时,将启动多个进程。     
已邀请:
进程外激活请求的路由由使用COM服务控制管理器注册类对象来控制。如果SCM具有可用的已注册类对象,则将用于为请求提供服务。如果没有,它将启动COM服务器的exe进程实例以获取一个。因此,多个激活请求是否路由到单个COM服务器exe进程至少取决于以下因素(我不确定这是否是完整列表): COM服务器在调用CoRegisterClassObject向SCM注册时指定的激活标志可能导致将来的激活请求导致新的exe进程实例被启动,最简单和最常见的情况是使用标志REGCLS_SINGLEUSE,这允许注册仅用于单个激活的类对象。 根据类的注册方式,来自不同安全上下文的激活请求可能由不同的COM服务器exe实例提供服务(当您的客户端应用程序在相同的安全上下文中运行时,这似乎不适用于您的方案)。     
Microsoft支持已发布有关此问题的详细文章:https://support.microsoft.com/en-us/kb/169321。本文涵盖了您的大部分问题     

要回复问题请先登录注册