从 ATL exe 服务器 (COM) 调用 .NET GUI

Posted

技术标签:

【中文标题】从 ATL exe 服务器 (COM) 调用 .NET GUI【英文标题】:Invoking .NET GUI from an ATL exe server (COM) 【发布时间】:2011-06-23 13:24:59 【问题描述】:

我们有以下情况:

一个 ATL COM 服务器(进程外,EXE),它承载带有连接点的 COM 对象。 这些对象“存在于”单个 (exe) 进程中,它们触发事件(使用 Fire_* 方法),以便其他进程(例如:不同进程中的 .NET GUI 应用程序,ATL EXE 服务器的“客户端”) ) 可以捕获这些事件并做出相应的反应。

目前,我们有一个 .NET 应用程序(Windows 窗体),它是 ATL 服务器的客户端。启动(双击)时,它将一些委托(事件处理程序)附加到 ATL 服务器中托管的 COM 对象事件(连接点)。每次从 ATL 服务器触发事件​​时,.NET 客户端通常会在主窗口中显示一些信息或打开一个新窗口供用户交互。 此解决方案基于以下文章:http://www.codeproject.com/KB/COM/cominterop.aspx#ConnectionPoints(COM-.NET 事件处理)。

上述场景假定用户在触发事件之前实际上已经双击了 .NET 客户端 (exe),即 - 显式打开了 .NET 应用程序。如果 .NET 客户端未打开(实例化),则触发的事件“丢失” - 没有客户端处理它。

我们想要以下情况:

当从 ATL 服务器触发事件​​时,应立即出现(弹出)窗口供用户交互(例如:填写电子邮件文本框并按“确定”),而无需启动.NET 客户端在一切之前明确。这样,用户将收到有关每个事件的通知,并可以对其做出交互反应。

我们查看了将 .NET 客户端应用程序作为 ATL 服务器内的 dll 托管的选项,但我读过从 ATL EXE 显示 GUI 是一个很大的“不可以”(任何 GUI,不仅仅是 . NET GUI(如 WinForms 或 WPF)。

当服务器和客户端在两个不同的进程中运行(并且“客户端”尚未运行)时,这可能吗? 有没有人遇到同样的问题?解决了吗(以及如何...)?

谢谢 ;-)

暗里

有解决办法吗?

【问题讨论】:

【参考方案1】:

您无法按照您描述的方式进行这项工作。如果没有人在听事件,那么就没有办法响应它。通过使用 Startup 文件夹中的快捷方式启动 .NET 应用程序可以轻松解决您的问题,因此它始终在用户登录时运行。在从服务器收到通知之前,您不必创建窗口。顺便说一句,偷走焦点是行不通的,因此您可能需要一个带有气球的 NotifyIcon。

【讨论】:

谢谢!我认为我无法逃脱“启动快捷方式”的事情......

以上是关于从 ATL exe 服务器 (COM) 调用 .NET GUI的主要内容,如果未能解决你的问题,请参考以下文章

javascript 的 ATL COM 事件

在 MFC+ATL EXE 中使用带有未注册接口的 IDispatchImpl

无法从 .NET 框架调用 ATL COM 对象

从 MFC 调用 ATL COM dll

如何在基于 ATL 的服务器中正确转换和使用本机 COM 类型?

ATL 结构在来自 dll 的 COM 对象上中断