Qt 中的 Win32 API

Posted

技术标签:

【中文标题】Qt 中的 Win32 API【英文标题】:Win 32 API in Qt 【发布时间】:2014-04-25 23:16:14 【问题描述】:

我有一个使用 MFC 编写的程序,用于通过以太网与设备进行通信。我需要重写它并将其转换为 Qt。

MFC 程序使用 Win API 函数,如 CreateFile、ReadFile(获取网络数据包)和 DeviceIOControl(与用于促进通信的协议对话)

如果我包含 Windows.h,我可以直接在我的 Qt 代码中使用这些函数 - CreateFile、ReadFile 和 DeviceIOControl 吗?

WaitForSingleObject 和 Mutex 等用于并发的 Win API 函数怎么样? Win API 的哪些部分在 Qt 中可用/不可用?

是否有将 MFC 代码转换为 Qt 的标准机制?

【问题讨论】:

您可以使用来自 Qt 应用程序的任何 Windows API 函数(当然是为 Windows 编译的)。 Qt 与 Windows 同步原语的协作程度如何是您必须调查的。将 MFC 转换为 Qt 的标准机制:不要这样做。没有任何收获。 @IInspectable "整个 GUI 渲染都是在软件中实现的" 这是一件好事,因为如果你愿意,你可以并行化它。似乎你没有意识到所有遗留的 GDI/GDI+ 也完全在软件中完成,只是 Qt 的渲染有时比 Windows 的更快:) @IInspectable “Qt 需要额外的预处理阶段,增加了设置构建系统的复杂性” 不是预处理,而是代码生成。当然,真正了解他们的编程技巧的人会意识到代码生成器是一件好事。它们使您免于一遍又一遍地输入相同的无聊内容。他们节省的时间是在构建系统中设置 moc 的单一“支出”无法比拟的。 @IInspectable "你不能实现 Q_OBJECT 模板。"这是一个次要的挑剔,不是一个非常准确的挑剔——你当然可以拥有从QObject 基类派生的模板参数化类。如果你坚持,只要稍微调整一下moc,你仍然可以做到。 @IInspectable 在 MFC 中写入 this,然后我们会谈谈 :) 【参考方案1】:

如果我包含 Windows.h,我可以直接在我的 Qt 代码中使用这些函数 - CreateFile、ReadFile 和 DeviceIOControl 吗?

是的。

WaitForSingleObject 和 Mutex 等用于并发的 Win API 函数怎么样? Qt 中 Win API 的哪些部分可用/不可用?

您可以使用 Win API 的任何部分。

是否有将 MFC 代码转换为 Qt 的标准机制?

没有标准机制。但是,对于上述功能,您确实需要研究 Qt 替代方案,例如 QMutex 等。

此外,您还需要考虑转换是否值得。毕竟,Qt 会在后台使用 Windows 上的 Windows API。

假设您希望使您的代码跨平台,您真的希望从直接使用 Windows API 迁移,否则您的代码最终将充满编译时预处理器指令。

【讨论】:

我不打算让我的应用程序跨平台。我只是想用更好的应用框架。 我在想我会以当前形式保留使用 Windows API 的代码部分,并随着时间的推移逐步淘汰它。因为,我不担心支持跨平台兼容性,所以我有能力花时间使用它。 哦不,不,我在回复“假设您希望使您的代码跨平台”。我只是让你知道,对于这个应用程序,我不知道。 好吧,你比我更了解你的项目。 :) 鉴于 IInspectable 的评论,你认为我的前提是 Qt 是一个比 MFC 更好的应用程序框架是正确的吗?我想做实时图像采集和处理,大量数据,大量实时处理。

以上是关于Qt 中的 Win32 API的主要内容,如果未能解决你的问题,请参考以下文章

汇编中的win32 api帮助

Win32 API 中的 ReadFile 函数

当前 Windows 版本中的 Win32 API 是不是仍然“原生”?

C# .NET Framework API(非 Win32 API)中的 CreateProcessAsUser()

Qt调用dll中的功能函数

如何从 Win32 API 中的总线关系中获取设备实例路径