Jer*_*nes 5 c# c++ com interprocess
我有一个进程外的COM服务器,需要密切关注事物.此服务器作为服务运行,并且在内部是单例.为简单起见,我会称他为BossCom.
我有另一个进程外COM服务器,它是一个工作者.对于系统稳定性而言,它是一次性服务器(意味着如果您创建2个WorkerCom,则有2个WorkerCom.exe正在运行).为简单起见,我会称他为WorkerCom.
WorkerCom可以通过任何东西启动,即使有人通过命令行使用正确的命令行参数运行他也可以启动它.
总体目标是让BossCom知道什么是WorkerComs,知道他们在做什么,并能够给他们订单(暂停,停止,加速等).
我最初的想法是,每当WorkerCom启动时,他都会CoCreateInstance一个BossCom并调用BossCom-> RegisterWorker(IUnknown me).然后当WorkerCom即将关闭时,他会调用BossCom-> UnregisterWorker(IUnknown me).BossCom可以为IWorkerCom查询IUnknown,并能够发出命令.
如果所有这些com对象都在同一个进程中,那将会很有效,但它们不是.我想过使用GlobalInterfaceTable,但它只是单个进程意义上的全局.
我花了几天时间研究这个并且不知所措.也许我是隧道视野.
如何编组从Worker到Boss的com对象的引用?
哦,而且,值得一提的是,BossCom是用C#编写的,而WorkerCom是用ATL C++编写的,但我会用VB,Scala,Lisp等编写的解决方案.我想我可以翻译核心理念.:-)
根据评论,这确实是开箱即用的。不过,还有一个额外的细节使其发挥作用。
最初,当我查看处理复制接口的 C# 接口时,参数类型是 IntPtr。嗯,IntPtr 只是一个 long,所以它按原样传输值,因此不起作用。
关键是设置参数的 MarshalAs 属性。所以我的 RegisterWorker 方法如下所示:
public void RegisterWorker(
[In, MarshalAs(UnmanagedType.IUnknown)] object ptr
)
{
IWorkerCom worker = (IWorkerCom) ptr;
Workers.Add(worker);
}
Run Code Online (Sandbox Code Playgroud)
太棒了。