0

在 Windows 7 中,我有一个进程外 COM 服务器,例如“MyComServer.exe”。我将其注册为CLSCTX_LOCAL_SERVERREGCLS_MULTIPLEUSE | REGCLS_SUSPENDED

在交互式会话中,会话号 > 0,我的 MyComServer.exe 只运行一个实例,无论有多少客户端正在运行。假设我正在使用我的 COM 服务器运行 5 个 excel、3 个 matlab 和其他 7 个,我只看到 1 个 MyComServer.exe 正在运行。这很好,这就是我想要的。

如果有多个会话处于活动状态,例如会话 1、2 和 3,那么我会看到 3 个 MyComServer.exe 实例。使用任务列表,我可以看到每个实例都在不同的会话中运行。这也很好,正如我所愿。

但是,如果我从会话 0 中使用它,我会看到每个客户端都有一个实例。假设我有 3 个 Windows 服务都在使用它,然后我看到 3 个 MyComServer.exe 实例。使用任务列表,我看到所有 3 个都在会话 0 中运行。会话 0 中的进程可以共享进程外 COM 服务器吗?

调查这个问题我注意到PostMessage会话 0 中的进程之间不起作用。阅读我理解的文档PostMessage不应该跨会话,这意味着会话 0 中的进程无法向会话 1 中的进程发布消息。我注意到,虽然会话 1 中的进程可以向同一会话中的另一个进程发布消息,但会话 0 中的进程不能向任何其他进程发布消息,即使目标也在会话 0 中运行。有人可以确认一下吗?它似乎与 Microsoft 文档不一致。

谢谢。

4

1 回答 1

0

从 Vista 开始,会话 0 仅托管服务和系统进程。用户应用程序在会话 1、2 等中运行。

PostMessage并且SendMessage不在会话 0 中工作。无法跨会话边界发送消息。至于在会话 0 中发送消息,这没有任何意义,因为该会话中只有服务和系统进程。

关于 COM,您应该注意到会话 0 隔离也适用于 COM+ 服务器应用程序和 COM 进程外应用程序,这些应用程序在交互式用户之外的任何其他设备下运行。请参阅会话 0 隔离、COM 和 COM+

会话 0 隔离不限于 NT 服务。它也适用于在交互式用户之外的任何其他环境下运行的 COM+ 服务器应用程序和 COM 进程外应用程序。因此,与第一个登录用户处于不同终端服务器会话中的服务相关的所有问题现在也适用于 dllhost 进程(COM+ 或代理 COM dll)和 COM 服务器应用程序。

于 2014-04-23T14:05:42.447 回答