接口描述语言(Interface description language,缩写IDL)

c++写的接口,只能c++和c识别,为了接口的通用性,让所有的语言都通用的定义使用接口
引入IDL,使用IDL定义接口以后,用MIDL编译为c++可用的接口定义

接口描述语言 - IDL(Interface Definition Language )

1 IDL和MIDL

IDL - 定义接口的一种语言,与开发
       语言无关.
     MIDL.EXE - 可以将IDL语言定义接口,
       编译成C++语言的接口定义

2 IDL的基础

IDL接口定义方式:
在项目中添加**.idl文件,在文件中:
1导入idl
      import "XXXX.idl"
2定义属性     
      [
        attribute
      ]
3定义接口
      interface A : interface_base
      {
      }
编译后生成三个文件
**_h.h 接口头文件
**_i.cpp 接口GUID
**_p.cpp 远程调用相关,代理层
   
    2.1 Import 导入IDL文件,相当于C++的
        #include
    2.2 使用"[]"定义区域,属性描述
      关键字,描述接口GUID等信息
       1) object - 后续是对象
       2) uuid - 定义对象GUID
       3) helpstring - 帮助信息
       4) version - 版本
       5) point_default - 后续对象
         中指针的默认使用方式
         比如: uniqune - 表示指针可以
           为空,但是不能修改
  
    2.3 对象定义
       1) 父接口是IUnknown接口      
       2) 在对象内添加函数,函数定义必须
       是返回 HRESULT.
       HRESULT是32位整数,返回函数是否
       执行成功,需要使用 SUCCESSED和
       FAILED宏来判断返回值.

COM接口

按照COM规范定义的接口,即为COM接口

1 COM接口的规范

1.1 IUnknown接口的等价性 -
判断两个接口相等,需要获取两个接口的IUnknown接口
判断IUnknown接口的地址是都相等。
1.2自反性
接口可以使用QueryInterface查询到自己
1.3 对称性
接口A可以查询到接口B,那么接口B也可以查询到接口A
1.4 传递性
接口A可以查询到接口B,接口B可以查询到接口C,那么接口A就可以查询到接口C
1.5 时间无关性
接口A在某个时间可以查询到接口B,那么在后续的任何时间中也可以查询到接口B

2 接口的编写

2.1 定义IDL(编译后生成3个文件)
IDL文件项目属性有了 MIDL(将IDL定义的接口编译为c++语言)选项,其中Mktyplib compa...选项去掉,组件内部相关,不去掉IDL编译失败
*_i.c 接口ID定义   
*_h.h 接口头文件
*_p.c 接口代理层实现
2.2 实现接口
自定义实现类继承接口类,并实现相关函数,注意引入相关头文件(接口头文件和GUID定义文件)
自定义实现类中实现相关函数时必须使用STDMETHOD(无返回值)STDMETHOD_(有返回值)声明函数,STDMETHODIMP STDMETHODIMP_实现函数
2.3 实现接口的导出
实现全局接口创建函数
定义def文件中导出接口创建函数

COM组件

1 COM接口和COM组件

COM接口 - 函数集合
      COM组件 - 
从接口角度:COM组件是一个接口的集合
        从C++语言看:COM组件是一个类或多个类
从编程看:COM组件是一段可以执行的代码
      COM组件通过一个或多个COM接口展示自己的功能
    ---------
||----o IUnknown  接口
|组件|
||----o IMath   接口
||
---------

2 组件的实现

2.1 定义类实现组件的功能
2.2 每个组件都具有一个GUID
一般宏定义为:CLSID_组件名称
2.3 在IDL中,定义组件
[
uuid(39B16755-783D-49B1-93E2-0FCA9F66CC2D)
]
coclass Math
{
interface IMath;
};
2.4 创建组件,并获取接口
创建时传入组件GUID,在查询接口时加入组件GUID的判断

IDL实现COM组件代码示例

math.idl

import "oaidl.idl";
import "ocidl.idl";
import "objidl.idl";[object,uuid(CFF0849D-61E2-4ED1-9DC9-0E43E2FBDE25)
]interface IMath :IUnknown
{HRESULT Add(long nAdd1, long nAdd2, long* pnAdd) = 0;HRESULT Sub(long nSub1, long nSub2, long* pnSub) = 0;
};
[uuid(39B16755-783D-49B1-93E2-0FCA9F66CC2D)
]
coclass Math
{interface IMath;
};

CimpMath.h

#pragma once
#include "math_h.h"class ClmpMath:public IMath
{
public:ClmpMath();~ClmpMath();
//IUnKnuwn
public:STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppiObject);STDMETHOD_(ULONG, AddRef)();STDMETHOD_(ULONG, Release)();
//IMath
public:STDMETHOD(Add)(long nAdd1, long nAdd2, long* pnAdd);STDMETHOD(Sub)(long nSub1, long nSub2, long* pnSub);
//
public:LONG m_nRef;
};

CimpMath.cpp

#include "stdafx.h"
#include "ClmpMath.h"ClmpMath::ClmpMath()
{m_nRef = 0;
}ClmpMath::~ClmpMath()
{
}STDMETHODIMP ClmpMath::QueryInterface(REFIID iid, LPVOID* ppiObject)
{if (iid == IID_IUnknown){*ppiObject = static_cast<IUnknown*>(this);}else if (iid == IID_IMath){*ppiObject = static_cast<IMath*>(this);}else{*ppiObject = NULL;return E_NOINTERFACE;}AddRef();return S_OK;
}STDMETHODIMP_(ULONG)ClmpMath:: AddRef()
{InterlockedIncrement(&m_nRef);return m_nRef;
}
STDMETHODIMP_(ULONG)ClmpMath::Release()
{InterlockedDecrement(&m_nRef);if (m_nRef == 0){delete this;}return m_nRef;
}STDMETHODIMP ClmpMath::Add(long nAdd1, long nAdd2, long* pnAdd)
{if (pnAdd == NULL){return E_POINTER;}*pnAdd = nAdd1 + nAdd2;return S_OK;
}
STDMETHODIMP ClmpMath::Sub(long nSub1, long nSub2, long* pnSub)
{if (pnSub == NULL){return E_POINTER;}*pnSub = nSub1 + nSub2;return S_OK;
}

组件创建函数

IUnknown* CreateInstanceEx(CLSID clsid)
{//判断组件的CLSIDif (clsid == CLSID_Math){//创建对象ClmpMath* pMath = new ClmpMath;//获取接口IUnknown* piUnknown = NULL;pMath->QueryInterface(IID_IUnknown,(LPVOID*)&piUnknown);//返回接口return piUnknown;}return FALSE;
}

IDL接口描述语言和COM接口COM组件相关推荐

  1. 什么是 Thrift(RPC)?一种接口描述语言和二进制通讯协议,用来定义和创建跨语言的服务

    Table of Contents 什么是Thrift 架构 什么是RPC框架? Thrift的协议栈结构 优点 创建一个Thrift服务 Thrift的第一个java小实例 Thrift是一种接口描 ...

  2. java 组件 接口_java学习之图形用户接口AWT组件部分

    记录学习Java私塾Java视频培训教程中级-9 图形用户接口AWT组件部分 学习视频资源分享: 地址:http://pan.baidu.com/s/1eSDiZAi 密码:lvy6 PS:视频的画质 ...

  3. api,api接口,通用组件,通用服务,sdk

    通用服务 通用服务一定有客户端 和 服务端,一定涉及远程调用 客户端 叫做 服务客户端组件(客户端组件可以调 通用服务通过feign调用) api api一般指的是,java开发包(这里不包括cont ...

  4. 易语言和java接口_易语言写接口让其他调用 易语言api使用教程

    易语言如何调用API函数? 你代码方法错了,如果传出参数为文本或字节集必须先"申请内存缓冲",如图1 源码中有两种方法,建议你采用"长整数"的那个,比较方便~! ...

  5. 用C语言编程实现接口COM组件,把《C语言接口与实现》读薄之第一章:引言

    1.1文学程序 文学程序(literate program):接口及其实现的代码与对其进行解释的正文交织在一起.文学程序由英文正文和带标签的程序代码块组成.例如, 1 〈compute x * y〉≡ ...

  6. HarmonyOS之IDL接口使用规范

    一.接口描述语言简介 当客户端和服务器通信时,需要定义双方都认可的接口,以保障双方可以成功通信,HarmonyOS IDL(HarmonyOS Interface Definition Languag ...

  7. 浅谈JDK、JRE、和JVM之间的关系

    基本概念 JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).JDK不仅包括开发者需要的开发者环境,同时包括有程序运行所需要的支持环境JRE. JRE(J ...

  8. COM 组件设计与应用(十一)—— IDispatch 及双接口的调用

    原文:http://www.vckbase.com/index.php/wv/1236 一.前言 前段时间,由于工作比较忙,没有能及时地写作.其间收到了很多网友的来信询问和鼓励,在此一并表示感谢.咳. ...

  9. 解决IDL检索COM类工厂中CLSID为{ }组件注册失败

    作者用的envi版本为5.3 在第一次利用C#对IDL进行二次开发出现组件注册失败 解决方法: 亲测有效 以管理员的身份运行命令提示符 然后在文本框内输入即可解决 C:\Windows\System3 ...

最新文章

  1. ZooKeeper简单使用
  2. slice(),substring()和substr()的异同
  3. 【SpringCloud】Zuul-实例
  4. Confluence 6 针对 'unmigrated-wiki-markup' 宏重新尝试合并
  5. 减去字符串_从文本字符串中提取指定值的6个超级技巧解读
  6. ASP.NET企业开发框架IsLine FrameWork系列之六--DataProvider 数据访问(下)
  7. 同济大学自动化与计算机科学,同济大学本科专业选通信工程好,还是选自动化好呢?...
  8. binary-tree-maximum-path-sum——二叉树任意一条路径上的最大值
  9. 强大的SqlCacheDependency【转】
  10. Centos7——NFS(Network File System)服务
  11. 【Cocos2d入门教程五】Cocos2d-x动作篇
  12. ProtoBuf生成EmmyLua注解API提示文件(支持复杂的嵌套结构)
  13. 使用BoundsChecker
  14. 西点军校的经典法则(转载)
  15. 关于Eclipse在servlet中连接数据库时出现驱动加载失败的解决
  16. 170313-pyGUI爬虫和正则回溯陷阱
  17. TYPHOON cms漏洞 简书(ssh篇)
  18. DOS时代后,金山系再出神级办公软件,会像WPS一样普及
  19. windows控制面板卸载程序失败(等待。。。)
  20. php发送邮件——SMTP服务器配置图文教程

热门文章

  1. 链表问题全面汇总与解析
  2. 剑指Offer——JZ55.链表环的入口结点【快慢指针】
  3. html5中video标签设置视频的宽度和高度
  4. 人机交互-广州DACAI触摸屏开发中遇到的一些(屏幕和编程)问题
  5. 什么是TWS蓝牙耳机?
  6. 磨削工具类毕业论文文献有哪些?
  7. C语言百日千题系列之《忘情水题》第一日
  8. web项目中报错:错误: 找不到或无法加载主类
  9. python语音地图定位_Slam(即时定位与地图构建) 知识篇
  10. Flutter Container、Center设置控件居中背景及其他属性