我正在尝试在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程序员中有哪些想法?感谢。
答案 0 :(得分:0)
嗯,你有三个选择。
选项1.如果您可以更改该组件接口 - 请执行此操作,重命名枚举值,以使它们不与Windows SDK冲突。
选项2.将#import
与rename
一起使用。虽然你有数百个这样的元素,你可以使用反斜杠构建一个很好的表分割列表。
选项3.尝试将#import
隔离到单独的.h文件中,以便所有Windows SDK中都不包含这些文件,或者至少导入的文件数量少得多。这将消除或减少冲突,然后您可以使用rename
来解决剩余的冲突。