介绍下COM接口相关的宏

今天讲COM,很多人可能比较畏惧这东西,但是还是有必要讲解讲解。人活一世,多学点知识,不亏。

在声明COM接口的时候,我们可以选择两种方法,一种比较复杂,另一种比较简单。就看你选择哪个颜色的药丸了。

简单方式

直接使用一个IDL文件来声明COM接口,然后将这个IDL文件丢给MIDL编译器,它会对IDL文件进行解析并为你生成对应的COM接口代码。如果你使用这种方式,则可以得到__uuidof这个关键字的支持,不得不说,这个买卖十分划算。

复杂方式

复杂的方式是,以上过程全部自己手工进行。如果你确实觉得生活太没意思,想全部自己来,也可以,你可以参考如下代码:

介绍下COM接口相关的宏

需要遵循的规则

> 必须将INTERFACE宏设置你准备声明的COM接口名称。请注意,还需要使用#undef来取消之前的定义值。
> 必须使用DECLARE_INTERFACE和DECLARE_INTERFACE_宏为接口来生成必要的基础数据结构。对于没有基类的接口,请使用DECLARE_INTERFACE宏,对于那些继承自其它接口的接口,请使用DECLARE_INTERFACE_这个宏。在我们的例子代码中,我们的ISample2接口继承自ISample,所以这里使用了DECLARE_INTERFACE_。实际上,在真实项目中,你应该不大可能看到DECLARE_INTERFACE这个宏,因为在COM世界,所有的接口都继承自IUnknown接口。
> 定义的所有基类方法的先后顺序都必须和其基类中的顺序完全一致。接口中新添加的类需要被定义在代码的结尾。
> 必须使用STDMETHOD或者STDMETHOD_宏来声明接口方法。让接口方法返回HRESULT时,请使用STDMETHOD宏,当接口方法返回其他类型时,请使用STDMETHOD_宏。

> 如果方法没有任何参数,则参数列表必须写成(THIS)。如果有参数,则需要在方法参数的起始位置添加THIS_。
> 在方法声明的最后,必须添加一个PURE。
> 在方法的大括号里,必须使用BEGIN_INTERFACE和END_INTERFACE来将整个方法包含起来。

以上的每一条准则都是有原因的。它们与能够对C和C++声明使用相同的头文件以及与不同编译器和平台的互操作性有关。下面我们来看看准则背后的原因。
> 使用INTERFACE的原因是它的值后面会被THIS和THIS_宏使用到。
> 必须使用 DECLARE_INTERFACE* 宏之一来确保为C和C++生成正确的内部代码。对于C语言,会定义一个vtable结构,对于C++,编译器会自动处理vtable。另一方面,因为C++有继承的概念,我们使用的宏必须能指明其基类,从而实现类层次结构的向上转换。
> 必须以与原始声明中完全相同的顺序列出基类方法,以便派生类的C语言vtable结构与基类的结构在它们重叠的范围内匹配。 这需要保留派生接口可以用作基接口的COM规则。
> 必须使用 STDMETHOD 和 STDMETHOD_ 宏来确保为函数原型声明了正确的调用约定。 对于 C,宏在 vtable 中创建了一个函数指针; 对于 C++,宏创建了一个虚函数。
> 使用 THIS 和 THIS_ 宏,以便 C 声明显式声明 C++ 中隐含的“this”参数。 根据参数的数量需要不同的版本,以便在零参数情况下不会产生语法错误。
> PURE 一词确保 C++ 虚函数是纯的,因为 COM 接口的定义特征之一是所有方法都是纯虚的。
> BEGIN_INTERFACE 和 END_INTERFACE 宏发出编译器厂商提供的特定于编译器的代码,以确保生成的接口与COM vtable布局规则相匹配。不同的编译器需要不同的内部代码,尽管随着时间的推移,对内部代码的需求正在逐渐消失。

我想,你现在应该知道为什么我称之为“复杂方式”了吧?

实现接口时也适用类似的规则。 使用 STDMETHODIMP 和 STDMETHODIMP_ 宏来声明方法的实现,以便它们能使用正确的调用约定。后面我们会举一个对应的例子来说明如何使用这两个宏。

总结

欢迎各位老哥第185次来学习COM知识。
不放弃一个东西,说明你对它确实是真爱。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《The macros for declaring and implementing COM interfaces》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

介绍下COM接口相关的宏

上一篇:win10 成功删除 $WINDOWS.~BT 文件夹


下一篇:Photoshop为公园路边的美女调制出甜美的蓝紫色