[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

相关文章

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

模拟实现vector中的常见接口

insert void insert(iterator pos, const T& x){if (_finish == _endofstorage){int n = pos - _start;size_t newcapacity = capacity() == 0 ? 2 : capacity() * 2;reserve(newcapacity);pos = _start + n;//防止迭代

京东物流查询|开发者调用API接口实现

快递聚合查询的优势 1、高效整合多种快递信息。2、实时动态更新。3、自动化管理流程。 聚合国内外1500家快递公司的物流信息查询服务,使用API接口查询京东物流的便捷步骤,首先选择专业的数据平台的快递API接口:物流快递查询API接口-单号查询API - 探数数据 以下示例是参考的示例代码: import requestsurl = "http://api.tanshuapi.com/a

股票数据接口-陈科肇

陈科肇 新浪财经 sz-深圳sh-上海历史分价表:http://market.finance.sina.com.cn/pricehis.php?symbol=sz000506&startdate=2016-12-27&enddate=2016-12-27历史成交明细(当日成交明细):http://vip.stock.finance.sina.com.cn/quotes_service/v

实例demo理解面向接口思想

浅显的理解面向接口编程 Android开发的语言是java,至少目前是,所以理解面向接口的思想是有必要的。下面通过一个简单的例子来理解。具体的概括我也不知道怎么说。 例子: 现在我们要开发一个应用,模拟移动存储设备的读写,即计算机与U盘、MP3、移动硬盘等设备进行数据交换。已知要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException异常

用Gson解析json数据的时候,遇到一个异常,如下图: 这个异常很简单,就是你的封装json数据的javabean没有写对,你仔细查看一下javabean就可以了 比如:我的解析的代码是             Gson gson = new Gson();             ForgetJson rb = gson.fromJson(agResult.mstrJson, For

对接话费充值API接口的开发步骤以及各种优势

对接话费充值API接口通常涉及以下步骤: 1.选择API提供商: 研究并选择一个可靠的话费充值API提供商。考虑因素包括覆盖范围、费率、交易限额、客户支持和用户评价。 2.注册和获取API密钥: 在选定的API提供商平台上注册账户,并获取API密钥或访问令牌,这是调用API时进行身份验证的必要信息。 3.阅读API文档: 仔细阅读API文档,了解如何构建请求、需要哪些参数、API的

java类中定义接口的有哪些好处

第一步:首先是是定义一个类,同时里面定义接口 public class Util { public interface Worker { void work(int a); } } 第二步:定义一个类去实现第一步类中定义的接口 public class Demo implements Worker { @Override public void work(int a) { System