在带有 msvc2008 编译器的 Qt 中使用 afx_msg

Posted

技术标签:

【中文标题】在带有 msvc2008 编译器的 Qt 中使用 afx_msg【英文标题】:Using afx_msg in Qt with msvc2008 compiler 【发布时间】:2011-06-14 21:53:48 【问题描述】:

正如标题所说,我正在使用 msvc2008 编译器在 Qt 中开发一个项目。

我正在尝试使用 afx_maps 的示例代码,据我所知(我真的不知道 afx 是如何工作的),下面的代码意味着当消息 WM_PI_RAWDATA_READY收到(我不知道它是在哪里或如何收到的),函数 OnRawDataReady 被触发。

//AFX_MSG_MAP(CPDImfcDlg)
ON_MESSAGE(WM_PI_RAWDATA_READY, OnRawDataReady )
//AFX_MSG_MAP

我尝试将代码复制到我的项目中,然后在标题中添加#include,但它给了我以下错误:

D:\Program Files\Microsoft Visual Studio 9.0\VC\ATLMFC\INCLUDE\afx.h:24: error: C1189: #error :  Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]

我在其他地方找到的修复似乎是 Visual Studio 中的项目设置,所以我不知道如何解决它。

关于如何解决此问题或如何解决 afx_msg 问题的任何想法?

非常感谢

【问题讨论】:

这与 Qt 有什么关系,因为...? 因为我正在使用 microsoft 编译器在 Qt 中处理项目,因此我无法访问 Microsoft Visual Studio 2008 中提供的项目设置。 但是使用消息映射的代码绝对是 MFC 代码,我不明白你为什么要在 Qt 项目中使用 MFC,但也许我还没有完全理解这样做的动机。所以现在我的问题是,Qt 项目与 MFC 消息映射有什么关系。 @Christian Rau:我正在使用的硬件的示例代码是在 Visual Studio 项目中编写的。我想从示例项目中复制代码。我并不真正了解整个 afx 的东西,所以我不确定如何使其适应工作。由于我使用的是 microsoft 编译器,因此我希望它能够正常工作,但事实并非如此。 如果您解决了您的问题,它应该可以工作(将在此发布答案),但它不会真正与您的 Qt 项目一起使用,因为此代码绝对是 MFC 代码(这是另一个围绕 Win32 API 的 GUI 工具包)。从设计的角度来看,与将其移植到 Qt 相比,仅将这个示例集成到 Qt 项目中并没有那么好,但它至少应该可以工作。 【参考方案1】:

只做错误消息所说的事情和#defineing _AFXDLL 预处理器符号怎么样。根据您的构建环境,您只需将其作为参数添加到编译器命令行(/D_AFXDLL,如果我没记错的话)。但是,当您使用 Qt 时,您可能无论如何都会得到一个 *.pro 文件,并且可以将它添加到那里(使用 DEFINES 变量)。所以只需将此行添加到您的 *.pro 文件中

DEFINES += _AFXDLL

但是仅仅将 MFC 代码集成到 Qt 应用程序(它们是两个完全不同的 GUI 和 OS 抽象库)中并没有太大帮助,因为它们不能很好地协同工作,更不用说设计了问题。也许您可以将应用程序从 MFC 移植到 Qt。

【讨论】:

我尝试了整个 DEFINES,但随后我必须删除 #include ,这会产生全新的转换或错误。知道整个 afx_msg 的 Qt 等价物是什么吗?我会试着翻译成那个... 取决于您对 Qt 和 MFC(以及 Win32)的了解。 MFC 消息映射只是将 windows 消息映射到类方法(实际上 afx_msg 关键字只是被定义为空,它用于类向导)。与 Win32 消息最接近的 Qt 等价物是事件,但它并不像更改一些关键字那么容易。您必须将整个应用程序重新设计为 Qt,这取决于代码和您个人的 Qt、MFC 和 Win32 能力,并且可能会变得相当复杂。它不仅会减少到需要回答的几个 SO 问题。 说实话,我对他们中的任何一个都不太了解。消息 WM_PI_RAWDATA_READY 将由硬件发送,对吗?那么是否有可能以某种方式使用 QWidget::winEvent() 来读取此消息,然后触发与 afx_msg 相同的事件?该消息触发了“LRESULT”功能,但我真的不知道LRESULT的意义。 猜猜这是一个不同的问题,感谢您解决这个问题。稍后我会发布一个关于 winEvent(Filter) 的问题。【参考方案2】:

它基本上说您必须使用静态库或 DLL。你不能混音。

正如你所说,这是项目设置的一部分。

【讨论】:

以上是关于在带有 msvc2008 编译器的 Qt 中使用 afx_msg的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 msvc 2019 编译 QT 4 dll?

Qt安装显示:MSVC2015 编译器带有感叹号,及解决办法

Qt Creator 2.6.1 + Qt 5 + C++11 + MSVC2010 编译器

如何使用 MSVC 2008 在 Windows 上使用 qtwebkit 构建 Qt5 - leveldb 找不到 stdint.h

Qt Creator调用VS2008生成的DLL注意事项 good

由于不同版本的 MSVC 和 Qt 库导致链接错误