65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET 和 COM 对象事件在控制台应用程序中的应用

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.80/5 (2投票s)

2007年9月6日

CPOL

1分钟阅读

viewsIcon

25741

downloadIcon

183

如何在控制台应用程序中使用应用程序消息循环接收 COM 对象事件。

引言

最近,我遇到一个奇怪的问题。我收到一个事件分发的 COM 对象(由我们公司以外的公司编写),我需要将其集成到我们公司开发的系统中。我得到一个不错的 GUI 应用程序,演示了如何使用该 COM 对象(非常简单,我必须说),我心想——“哦,这很容易!” 但后来……它就是无法正常工作——没有从该对象接收到任何事件。在比较我收到的示例和自己创建的测试应用程序后,我发现该 COM 对象只有在存在消息循环时才会分发事件。因此,我需要一个消息循环来分发事件,并且我还需要使用该线程来调用该 COM 对象中的函数。这里有一个可能的解决方案示例。

背景

消息循环会占用一个线程,也就是调用 Application.Run 函数的线程。与此消息循环的通信可以通过向消息循环发布消息来完成。在 GUI 线程中,可以使用 Control 类中提供的 BeginInvoke 函数轻松完成。在控制台应用程序中,这有点困难,您需要使用 P/Invoke 来发布消息并找到当前消息循环 ID。

Using the Code

创建消息循环线程

//getting my thread ID. This is a P/Invoke call. It will get the native thread ID
id = GetCurrentThreadId();
//creating filter and delegate to run upon message ID
IMessageFilter filter1 = new MyMessageFilter(MESSAGE_TYPE_1, MyDelegate1);
//adding filter to the message loop
Application.AddMessageFilter(filter1);
//running the message loop. This call will halt till the call to Application.ExitThread()
Application.Run(new ApplicationContext());

向应用程序循环发送消息

PostThreadMessage(id, MESSAGE_TYPE_1, UIntPtr.Zero, IntPtr.Zero);

关注点

我找到一个非常好的网站,叫做 PInvoke.NET。它帮助我正确地定位和定义 P/Invoke 声明。

历史

  • 2007年9月6日:首次发布。
© . All rights reserved.