gpt4 book ai didi

windows - 来自同一用户帐户的 LocalServer32 EXE 的 COM 激活是否共享现有进程?

转载 作者:可可西里 更新时间:2023-11-01 13:29:29 25 4
gpt4 key购买 nike

当客户端应用程序调用 c_com_ptr::CreateInstance(使用 ATL 包装器)时,我有一个 COM 服务器 LocalServer32 EXE 启动。

在 Windows 7 上,当在同一用户帐户下运行的第二个客户端应用程序也调用 c_com_ptr::CreateInstance 时,将启动在同一用户帐户下运行的第二个 EXE 副本。我的印象是,从前世开始,第二个客户将共享第一个 EXE。

LocalServer32 进程是否共享?什么时候,什么时候不?谷歌搜索答案给了我一个巨大的噪声信号比,我找不到答案。

我的 CLSID 注册表项的 LocalServer32 值给出了 EXE 路径、ProgID、Programmable(空字符串)、TypeLib (GUID) 和 VersionIndependentProgId。我有一个 AppID key 。

想将 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 注册时指定的激活标志可能导致 future 的激活请求导致启动新的 exe 进程实例,最简单和最常见的情况是使用标志 REGCLS_SINGLEUSE,它允许注册的类对象仅用于单个激活。
  • 根据类的注册方式,来自不同安全上下文的激活请求可能由不同的 COM 服务器 exe 实例提供服务(这似乎不适用于您的场景,因为您的客户端应用程序在相同的安全上下文下运行)。

关于windows - 来自同一用户帐户的 LocalServer32 EXE 的 COM 激活是否共享现有进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5101843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com