【发布时间】:2011-06-09 04:24:05
【问题描述】:
我有一个进程外的 COM 服务器,需要密切关注。该服务器作为服务运行,并且在内部是单例的。为简单起见,我称他为BossCom。
我有另一个进程外 COM 服务器,它是一个工作者。为了系统稳定性,它是一个一次性服务器(这意味着如果您创建 2 个 WorkerCom,则有 2 个 WorkerCom.exe 正在运行)。为简单起见,我称他为 WorkerCom。
WorkerCom 可以由任何东西启动,即使有人通过带有正确命令行参数的命令行运行它,它也可以由它自己启动。
BossCom 的总体目标是了解 WorkerCom 周围的情况,知道他们在做什么,并能够给他们下达命令(暂停、停止、加速等)。
我最初的想法是,每当 WorkerCom 启动时,他都会 CoCreateInstance 一个 BossCom 并调用 BossCom->RegisterWorker(IUnknown me)。然后当 WorkerCom 即将关闭时,他会调用 BossCom->UnregisterWorker(IUnknown me)。 BossCom 可以为 IWorkerCom QueryInterface IUnknown 并能够发出命令。
如果所有这些 com 对象都在同一个进程中,那就太好了,但它们不是。我考虑过使用 GlobalInterfaceTable,但它只是在单个进程的意义上是全局的。
我花了几天时间研究这个并且不知所措。可能我是有远见的。
如何将 com 对象的引用从 Worker 编组到 Boss?
哦,而且,不管怎样,BossCom 是用 C# 编写的,而 WorkerCom 是用 ATL C++ 编写的,但我会采用用 VB、Scala、Lisp 或其他任何东西编写的解决方案。我想我可以翻译核心思想。 :-)
【问题讨论】:
-
这行不通?我承认我没有对 COM 做太多事情,但它在进程外的全部意义在于您已经让 COM 跨进程边界编组调用,不是吗?
-
对,对于大多数事情来说,但 IUnknown 只是一个指针,对吧? WorkerCom 中的“this”指针在 BossCom 中没有任何意义吧?或者编组过程是否会保持意义。我想我至少应该尝试一下。
-
它应该可以现成的,因为有代理/存根或类型库来促进编组。事实上,编组正是为了这一点——给客户端一个镜像到服务器的假对象(“代理”)。它从代码的角度透明地工作。
-
嗯...我想我应该尝试一下。我已经说服自己放弃了它,所以我什至没有尝试过。
-
@sharptooth 是对的,我认为。我在 EXE COM 服务器方面的经验也很有限,但除了 UI 控制和性能之外没有发现太多问题。在 ATL 中,会自动为 EXE COM 服务器生成代理 dll。客户端使用代理 dll 进程内方式,代理 dll 处理所有进程间工作。
标签: c# c++ com interprocess