使用#import指令导入COM类型库时暂时使用#undef宏

时间:2010-11-29 11:08:21

标签: com typelib

我正在尝试在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程序员中有哪些想法?感谢。

1 个答案:

答案 0 :(得分:0)

嗯,你有三个选择。

选项1.如果您可以更改该组件接口 - 请执行此操作,重命名枚举值,以使它们不与Windows SDK冲突。

选项2.将#importrename一起使用。虽然你有数百个这样的元素,你可以使用反斜杠构建一个很好的表分割列表。

选项3.尝试将#import隔离到单独的.h文件中,以便所有Windows SDK中都不包含这些文件,或者至少导入的文件数量少得多。这将消除或减少冲突,然后您可以使用rename来解决剩余的冲突。