【发布时间】: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 分钟,所以如果我从一开始就这样做的话,回想起来会更快。嗯,事后诸葛亮的好处……