在旧版 Win32 应用程序中实现 COM 事件接收器

Posted

技术标签:

【中文标题】在旧版 Win32 应用程序中实现 COM 事件接收器【英文标题】:Implementing COM event sinks in a legacy Win32 Application 【发布时间】:2014-08-29 11:56:19 【问题描述】:

我有一个需要使用 COM 对象的旧版 Win32 应用程序(WndProcs 等)。通过使用一些 ATL 标头和一些智能指针,这很容易,但是我目前正在努力解决的是如何最好地接收来自该 COM 对象的事件?

我目前的工作计划是构建第二个 COM 对象(作为 dll)来处理所有下沉并使用 Windows 消息与旧应用程序进行通信。这“没问题”,但是为了让遗留应用程序做我想做的事,有很多麻烦的消息来回移动。

是否有一种易于访问的方法让 Win32 旧版应用程序直接接收 COM 事件而不是通过第二个“接收器”com 对象运行?

在深入了解这个过程之前,我想看看是否有其他人之前遇到过这个问题并找到了可行的解决方案。

谢谢!

【问题讨论】:

"...直接接收 COM 事件..." : where ?连接点设计需要一个接口指针,在通过调用Advise() 注册所述接口后,它会将其事件发送到该指针。这就是连接点的工作方式。如果您问是否必须实现作为基于 DLL 的 inproc 服务器挂起该事件目标接口的 COM 对象,答案是否定的,但无论如何您都需要一个接口。如何提供该界面完全取决于您。 ATL IDispEventImpl 接受通过连接点和IDispatch::Invoke 传递的“典型”ActiveX 控件事件。 旧版应用程序使用什么编译器? Microsoft Visual Studio 2008 【参考方案1】:

偶然发现了总是才华横溢的 Raymond Chen 写的这篇出色的文章。

http://blogs.msdn.com/b/oldnewthing/archive/2013/06/12/10425215.aspx

正如 WhozCraig 上面指出的那样,我只需要接口指针并设置 Advise、处理 Invoke。

干净整洁。

谢谢!

【讨论】:

这很有帮助。谢谢你。我实际上很接近,但不知道如何处理 IDispatch 中的其他函数。原来。没有! ^^

以上是关于在旧版 Win32 应用程序中实现 COM 事件接收器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Win32 窗口中实现 MFC 资源?

VS下,在win32中实现trace功能

在旧版应用程序中混合现代数据访问

Android Studio 如何在 LinearLayout 元素中实现锚链接?

如何挂接IE键盘事件?

如何在旧版 IOS/旧版浏览器上使用 Graphql Vue Apollo?