编译/翻译Microsoft COM IDL到Idiomatic C ++?

时间:2012-06-02 16:25:55

标签: c++ qt com mfc idl

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

尽管如此,有没有人知道一个工具(免费或商业)将采用Microsoft IDL文件并将其转换为C ++,谁的接口不依赖于MFC和COM?

2 个答案:

答案 0 :(得分:1)

  

并使用midl.exe生成的代码

这是第一个挂断电话。 Midl.exe 生成代码,它只生成声明。 C ++中的纯虚拟类,只有 no 实现的方法声明。无论是.h文件还是.tlb类型的库文件。类型库很方便,因为它易于通过工具读取,具有受限制的COM子集,称为自动化。几乎可以通过Windows上的任何语言运行库实现。

关键是这些只是声明,是使代码编写在不同模块和/或不同语言或类库中的粘合剂。 非常在大型项目中非常重要,界面将各个部分组合在一起。

  

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

这是一个非常无益的建议。 “不要这样做”是我的医生告诉我什么时候把我的手臂放在背后疼。我可以忍受,我有一个很好的选择,可以转身。在您的情况下,我将不得不要求架构师更多。他正在弄乱身体部位,他将躯干与腿部,头部,脚部和手部分开。脑完全脱节。使您拥有的不同代码块的粘合剂现在可以协同工作。打破这个界面,你会严重破坏你的应用程序,Netscape风格。

谨防宇航员建筑师(另一位Spolsky的最爱),他很乐意强迫你进入理解但不必实施的东西。需要合理的替代方案,架构方法,因为破坏接口会对您的应用产生深远的架构影响。当你改变界面时,那些从界面中实现实现的MFC类几乎都是垃圾。将它们全部重写为Q类会严重妨碍你一段时间没有效率。写起来是无用的代码。只产生同样的东西,有更多的错误。你不应该做的事情,第2部分。

答案 1 :(得分:0)

如果您能够继续使用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