winapi中毫无意义的'MIDL_INTERFACE'宏?

时间:2011-01-11 23:49:38

标签: c++ winapi mingw

在浏览了一些旧代码之后,我注意到有些类是以这种方式定义的:

MIDL_INTERFACE("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
Classname: public IUnknown {
    /* classmembers ... */
};

但是,宏MIDL_INTERFACE定义为:

#define MIDL_INTERFACE(x) struct

在C:/MinGW/include/rpcndr.h(第17行左右)。宏本身显然完全没有意义,那么这个宏的真正目的是什么呢?

3 个答案:

答案 0 :(得分:9)

在宏扩展为

的Windows SDK版本中
 struct __declspec(uuid(x)) __declspec(novtable)

第一个允许使用__uuidof关键字,这是从typename获取接口guid的好方法。第二个禁止生成v-table,一个从未用于接口的表。空间优化。

答案 1 :(得分:3)

这是因为MinGW不支持COM(或者更确切地说,支持它非常糟糕)。定义COM组件时使用MIDL_INTERFACE,它由IDL compiler生成,它为您生成COM类型库和类定义。

在MSVC上,此宏通常会扩展为更复杂的初始化和注释,以将给定的C ++类公开给COM。

答案 2 :(得分:0)

如果我不得不猜测,那是两个用例中的一个:

  1. 可能有一个外部工具可以解析查找这些声明的文件。这个想法是,通过让宏评估为无害的东西,代码本身编译得很好,但外部工具仍然可以查看源代码并从中提取信息。

  2. 另一种选择可能是代码使用X Macro Trick之类的东西来有选择地重新定义这个预处理器指令的含义,以便代码的其他部分可以用其他方式解释数据。取决于#define的位置,这可能是也可能是不可能的,但这似乎是合理的,这可能是用例。这基本上是第一个选项的特例。