编译/翻译Microsoft COM IDL为惯用C++

Compile/Translate Microsoft COM IDL to Idiomatic C++?

本文关键字:C++ IDL COM 翻译 Microsoft 编译      更新时间:2023-10-16

我正在做一个相当大的项目,主要用C++使用MFC编写。我们的任务是逐步移植这个应用程序以使用Qt.几年前,我们的许多功能的包装器都是使用COM编写的。我觉得使用新Qt代码中的COM包装器将有助于隔离强制依赖MFC的代码。不幸的是,我们也被要求停止使用 COM/ActiveX。因此,在Qt中引入COM包装器的新消费者并不理想。Visual Studio有一个类向导,它将基于TLB文件中的接口生成一个C++类,但它依赖于MFC,并且接口仍然公开COM(LPDISPATCHSAFEARRAY*等)。

话虽如此,有谁知道一个工具(免费或商业)可以获取Microsoft IDL 文件并将其转换为C++,谁的接口不依赖于 MFC 或 COM?

并使用 midl 生成的代码.exe

这是第一点。 Midl.exe不生成代码,它只生成声明。 C++中的纯虚拟类,只有方法声明,没有实现。 到 .h 文件或 .tlb 类型库文件。 类型库很方便,因为它很容易通过工具读取,具有称为自动化的受限 COM 子集。 并且由Windows上几乎任何语言运行时实现。

关键点是,这些只是声明,是使用不同模块和/或不同语言或类库编写的代码协同工作的粘合剂。 在大型项目中非常重要,接口将各个部分联系在一起。

我们的

系统架构师了解了我们的方法,并建议我们找到一种方法,不将这些COM细节添加到新的Qt项目中。

这是非常无益的建议。 "不要那样做"是我的医生告诉我的,当我把胳膊放在背后很痛时。 我可以忍受,我有一个很好的选择,可以转身。 在你的情况下,我将不得不对建筑师提出更多要求。 他弄乱了身体部位,他把躯干和腿、头、脚和手分开。 大脑完全脱节。 使你现在拥有的不同代码块一起工作的粘合剂。 打破这个界面,你就会严重破坏你的应用程序,Netscape风格。

当心宇航员建筑师(另一个斯波尔斯基的最爱),他很乐意强迫你做一些他理解但不必实施的事情。 需要一个合理的替代方案,一种架构方法,因为破坏接口会对你的应用产生深远的架构影响。 当您更改接口时,每个人都从接口实现的那些 MFC 类几乎是垃圾。 将它们全部重写到 Q 类中会严重让你在一段时间内失去生产力。 并且编写的代码非常无聊。 只是为了产生同样的东西,有更多的错误。 你永远不应该做的事情,第 2 部分。

如果您能够继续使用 Visual C++,解决方案是使用 COM 的普通编译器支持。

您需要 #import 您的 TLB 文件

http://msdn.microsoft.com/en-us/library/8etzzkb6%28v=vs.100%29.aspx

然后,您可以利用 COM 编译器支持来处理 COM 对象实例,

http://msdn.microsoft.com/en-us/library/h31ekh7e.aspx