【问题标题】:Compile/Translate Microsoft COM IDL to Idiomatic C++?将 Microsoft COM IDL 编译/翻译为惯用 C++?
【发布时间】:2012-06-07 12:08:30
【问题描述】:

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

说了这么多,有没有人知道一个工具(免费或商业)可以获取 Microsoft IDL 文件并将其转换为 C++,谁的接口不依赖于 MFC 或 COM?

【问题讨论】:

  • 你不应该做的事情,第 1 部分:joelonsoftware.com/articles/fog0000000069.html
  • 不,普遍采用的二进制接口标准不会在树上生长。 Qt 做得很好,但它肯定不是通用的。
  • 我不想扔掉代码。我想重用它,但避免在新实现中添加对“遗留”技术的直接依赖。我也不关心二进制兼容性,我只想要一个带有包装库的标头集合来链接,而不是直接导入 TLB 和处理 COM 接口。
  • 你已经有了头文件,midl.exe 从 IDL 生成它们。目前尚不清楚为什么您依赖类型库,它们仅在无法处理 .h 文件的语言中需要。但在代码生成器中使用肯定很方便,包括 MFC 向导和#import 指令。通常,您正在尝试修补使应用程序的主要功能组件协同工作的粘合剂。更换胶水需要付出很多代价,所有东西都无法协同工作。
  • 也许我不清楚。现在我们在新的 Qt 组件中使用 #import 和 TLB,并使用 midl.exe 生成的代码。这意味着在我们的 Qt 项目中对QueryInterface() 的一些引用、与 COM 的 GIT、_bstr_t 等进行编组。我们的系统架构师了解了我们的方法,并建议我们找到一种方法,不要将这些特定于 COM 的内容添加到我们的新 Qt 项目中。我在 Studio 中提到的类向导似乎正是我想要的方法,除了它生成特定于 MFC 的代码。我只是希望存在一个类似的工具来创建更标准的 C++ 友好代码......

标签: c++ qt com mfc idl


【解决方案1】:

并使用 midl.exe 生成的代码

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

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

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

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

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

【讨论】:

  • 感谢宇航员建筑师参考,听起来很熟悉!但是,我仍然觉得您认为这个想法要么是浪费时间,要么通常是荒谬的。我只是想将特定于 COM 的代码隔离到单个包装库的内部。这意味着我想使用_com_ptr_t<IMyIter> 并将其包装在一个看起来很普通的 C++ 类中。我希望包装器返回wchar_t*std::wstring,而不是返回_bstr_t,因此它应该在内部进行转换。这真的有那么糟糕吗? VS 向导会执行此操作,但会创建基于 MFC 的代码。
  • 好吧,看起来有点浪费,但你为什么不继续前进呢?您已经有了 C++ 声明,您可以在 #import 指令生成的 .tlh 文件中找到它们。只需将它们重命名为 .h,按照您想要的方式重写它们,丢弃 .idl 文件并修复所有自动生成的代码。
  • 我正在与一位同事交谈,他提出了相同的方法,但我想要“第二意见”。我会相信你的 257k 声誉,并认为这是我正在寻找的意见。感谢您的见解。
【解决方案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

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2017-06-21
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多