加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows – 来自同一用户帐户的LocalServer32 EXE的COM激活是否

发布时间:2020-12-14 02:02:47 所属栏目:Windows 来源:网络整理
导读:当客户端应用程序调用c_com_ptr :: CreateInstance(使用ATL包装器)时,我启动了一个COM服务器LocalServer32 EXE. 在Windows 7上,当在同一用户帐户下运行的第二个客户端应用程序也调用c_com_ptr :: CreateInstance时,将启动在同一用户帐户下运行的EXE的第二个
当客户端应用程序调用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实例提供服务(当您的客户端应用程序在相同的安全上下文中运行时,这似乎不适用于您的方案).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读