【问题标题】:Temporarily #undef macros when using #import directive for importing COM typelib使用 #import 指令导入 COM 类型库时临时使用 #undef 宏
【发布时间】:2011-05-17 05:35:34
【问题描述】:

我正在尝试在 C++ 中使用 COM 库。我有一个#import "TheLibrary.dll",它使用库中的类创建 tlh 和 tli 文件。

现在,我的问题是 COM 对象公开了一些枚举,其中包含一些常量列表的值,这些常量列表也在 Windows SDK 标头中。我想这是因为 Visual Basic 开发人员已经命名了这些常量的变体,而不必使用它们的数值。

但这对我来说是个问题,因为这些头文件是在我的 typelib 被 #import'ed 之前包含的;所以现在枚举成员声明被替换为 windows 头文件中的数字常量,导致我的编译失败。

例子:

windows头文件:

#define RES_AND ((ULONG) 0x00000000)

生成的 tlh:

enum __declspec(uuid(-some guid-))
RestrictionKind
{
    RES_AND = 0,
.. etc

所以问题很明显; tlh 中的枚举被扩展,结果是尝试将常量分配给数字。

现在我看到了几种解决方案,但都没有吸引力:

  • 在#import 时对每个项目进行“重命名”。有数百个这样的常量,不期待。

  • 将枚举全部省略。这会严重削弱我对 COM 对象的访问(我还没有尝试过,也许整个库甚至会变得无法使用)。

  • 在#import 之前对所有这些常量执行#undef。同样,它们有数百个,除此之外,我之后将无法使用它们 - 除非我再次执行 #define...

所以我在这里有点不知所措。我希望有一种方法可以对枚举值进行大规模重命名,但 #import 指令上的文档并没有给我太多希望。

剩下的几个 COM 程序员有什么想法吗?谢谢。

【问题讨论】:

  • 你夸大了,毫无疑问。不会发生数百个宏名称冲突。只需#undef 他们。当你有十几个时放弃 COM。
  • 我刚刚编写了一个脚本来从编译器警告中生成 rename() 条目。有 834 次冲突。我现在编译它,一切似乎都很好。放弃这个组件不是一个选项(在编程中任何事情总是一个选项 - 假设'放弃这个组件将需要我重复 5 年的工作,测试和解决另一个不相关的应用程序中的错误,这COM 组件接口与')。
  • 另外,FWIW 脚本花了我 10 分钟,所以如果我从一开始就这样做的话,回想起来会更快。嗯,事后诸葛亮的好处……

标签: com typelib


【解决方案1】:

嗯,你有三个选择。

选项 1。如果您可以更改该组件接口 - 这样做,请重命名枚举值,以便它们不会与 Windows SDK 冲突。

选项 2. 使用 #importrename。尽管您有数百个这样的元素,但您可以使用反斜杠构建一个漂亮的表格来拆分列表。

选项 3. 尝试将 #import 隔离到一个单独的 .h 文件中,这样要么不包含在所有 Windows SDK 中,要么至少导入少量文件。这将消除或减少冲突,然后您可以使用rename 处理剩余的冲突。

【讨论】:

  • 谢谢。它是别人的组件,所以我无法更改它。我想我必须编写一个脚本来从编译器警告输出中生成“重命名”列表。呜呜。嗯嗯。
猜你喜欢
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-24
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多