[COM]接口描述语言IDL

2024-05-10 00:38
文章标签 接口 com idl 描述语言

本文主要是介绍[COM]接口描述语言IDL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、首先要清楚一点,使用IDL只是定义COM接口的一种方法(用C++也可以定义)。

IDL是一种语言,Microsoft Visual C++提供了MIDL工具,可以将IDL文件编译成C/C++兼容的接口描述头文件(.h)。

如下是用IDL写的一个IcwElement接口

[plain]  view plain copy
  1. [  
  2.     object,  
  3.     uuid(0736591A-734E-4a3d-A1F0-150A50E402BB),  
  4.     helpstring("IcwElement Interface"),  
  5.     pointer_default(unique)  
  6. ]  
  7. interface IcwElement : IUnknown  
  8. {  
  9.     [propget, helpstring("属性 Type")] HRESULT Type([out, retval] BSTR * type);  
  10.     [propget, helpstring("property Visible")] HRESULT Visible([out, retval] VARIANT_BOOL* pVal);  
  11.     [propput, helpstring("property Visible")] HRESULT Visible([in] VARIANT_BOOL newVal);              
  12.     [propget, helpstring("属性 Modified")] HRESULT Modified([out, retval] VARIANT_BOOL* pVal);  
  13.     [propput, helpstring("属性 Modified")] HRESULT Modified([in] VARIANT_BOOL newVal);  
  14. };  
其中有一些关键字可以参考MSDN: http://msdn.microsoft.com/en-us/library/aa367088(v=vs.85).aspx

使用MIDL编译后得到相应的C/C++代码如下:

[cpp]  view plain copy
  1. EXTERN_C const IID IID_IcwElement;  
  2.   
  3. #if defined(__cplusplus) && !defined(CINTERFACE)  
  4.       
  5.     MIDL_INTERFACE("0736591A-734E-4a3d-A1F0-150A50E402BB")  
  6.     IcwElement : public IUnknown  
  7.     {  
  8.     public:  
  9.         virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Type(   
  10.             /* [retval][out] */ BSTR *type) = 0;  
  11.           
  12.         virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Visible(   
  13.             /* [retval][out] */ VARIANT_BOOL *pVal) = 0;  
  14.           
  15.         virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Visible(   
  16.             /* [in] */ VARIANT_BOOL newVal) = 0;  
  17.           
  18.         virtual /* [helpstring][propget] */ HRESULT STDMETHODCALLTYPE get_Modified(   
  19.             /* [retval][out] */ VARIANT_BOOL *pVal) = 0;  
  20.           
  21.         virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Modified(   
  22.             /* [in] */ VARIANT_BOOL newVal) = 0;  
  23.           
  24.     };  
  25.       
  26. #else   /* C style interface */  

可见,生成的是C++代码,定义了一个抽象类,并有五个函数。函数名,参数,返回值,以及这个接口的GUID都是根据IDL文件自动生成的。

并且注意,生成的IcwElement类中是没有成员变量的,而成员变量的定义放在实现此接口的类中。

二、IDL中的接口一经修改,则需要改几个地方。由于接口改了,自动生成的.h文件也被修改,而因为其成员函数被写成纯虚函数,因而实现(继承)此接口的具体类处也必须实现这些纯虚成员函数。幸好,VS提供了工具自动完成这一套,我们只需向IDL的接口中添加属性,实现此接口的类便自动添加了相应的方法(put和get),当然具体类的成员变量需要自己添加。

参考:

1. 《COM原理与应用》——潘爱民

2. MSDN

这篇关于[COM]接口描述语言IDL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974943

相关文章

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学