1

我正在尝试在 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 程序员有什么想法吗?谢谢。

4

1 回答 1

0

好吧,你有三个选择。

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

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

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

于 2010-11-29T11:35:58.620 回答