傻大方


首页 > 潮·科技 > >

C++|介绍下COM接口相关的宏

傻大方提要:【C++|介绍下COM接口相关的宏】如果你确实觉得生活太没意思,想全部自己来,也可以,你可以参考如下代码:需要遵循的规则 必须将INTERFACE宏设置你准备声明的COM接口名称。请注意,还需要使用#undef来取消之前的...



按关键词阅读: C++

C++|介绍下COM接口相关的宏

文章图片


今天讲COM , 很多人可能比较畏惧这东西 , 但是还是有必要讲解讲解 。 人活一世 , 多学点知识 , 不亏 。
在声明COM接口的时候 , 我们可以选择两种方法 , 一种比较复杂 , 另一种比较简单 。 就看你选择哪个颜色的药丸了 。
简单方式直接使用一个IDL文件来声明COM接口 , 然后将这个IDL文件丢给MIDL编译器 , 它会对IDL文件进行解析并为你生成对应的COM接口代码 。 如果你使用这种方式 , 则可以得到__uuidof这个关键字的支持 , 不得不说 , 这个买卖十分划算 。
复杂方式复杂的方式是 , 以上过程全部自己手工进行 。 如果你确实觉得生活太没意思 , 想全部自己来 , 也可以 , 你可以参考如下代码:

需要遵循的规则> 必须将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》
【C++|介绍下COM接口相关的宏】


稿源:(漫漫开发路)

【傻大方】网址:http://www.shadafang.com/c/111395U592021.html

标题:C++|介绍下COM接口相关的宏


上一篇:海信|最受欢迎的家电品牌排名,第四名很意外,前两名实至名归

下一篇:tiktok|Tiktok在日本地区日渐爆火,卖家又如何利用Tiktok获取精准流量?