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

时间:2011-02-08 16:21:20

标签: .net com atl out-of-process

我们有以下情况:

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

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

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

我们想要以下情况:

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

我们在ATL服务器中查看了将.NET客户端应用程序作为dll托管的选项,但我读到从ATL EXE显示GUI是一个很大的“NO-NO”(任何GUI,不仅仅是。像WinForms或WPF这样的.NET GUI。

当服务器&客户端在两个不同的进程中运行(“客户端”尚未运行)? 有没有人遇到同样的问题?它解决了(以及如何......)?

谢谢; - )

欧米

有解决方法吗?

1 个答案:

答案 0 :(得分:1)

你不能按照你描述的方式来完成这项工作。如果没有人听取这个事件,那么就没有办法回应它。通过在Startup文件夹中使用快捷方式启动.NET应用程序来解决您的问题,以便在用户登录时始终运行。在从服务器获得通知之前,您不必创建窗口。偷走焦点不会起作用,所以你可能想要一个带气球的NotifyIcon。