转:IDL接口描述语言和COM接口COM组件

COM组件编程—接口定义语言IDL 通过IDL描述接口,再通过MIDL编译生成代理和残根DLL。 IDL的一个示例: import "unknwn.idl" ; typedef struct { double x ; double y ; double z ; } Point3d ; interface IZ : IUnknown { HRESULT FzStructIn([in] Point3d pt) ; 阅读详情

https://blog.youkuaiyun.com/rankun1/article/details/50850593

接口描述语言(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

  1. import "oaidl.idl";  
  2. import "ocidl.idl";  
  3. import "objidl.idl";  
  4.   
  5. [  
  6.     object,  
  7.     uuid(CFF0849D-61E2-4ED1-9DC9-0E43E2FBDE25)  
  8. ]  
  9.   
  10. interface IMath :IUnknown  
  11. {  
  12.     HRESULT Add(long nAdd1, long nAdd2, long* pnAdd) = 0;  
  13.     HRESULT Sub(long nSub1, long nSub2, long* pnSub) = 0;  
  14. };  
  15. [  
  16.     uuid(39B16755-783D-49B1-93E2-0FCA9F66CC2D)  
  17. ]  
  18. coclass Math  
  19. {  
  20.     interface IMath;  
  21. };  


CimpMath.h

  1. #pragma once  
  2. #include "math_h.h"  
  3.   
  4. class ClmpMath:public IMath  
  5. {  
  6. public:  
  7.     ClmpMath();  
  8.     ~ClmpMath();  
  9. //IUnKnuwn  
  10. public:  
  11.     STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppiObject);  
  12.     STDMETHOD_(ULONG, AddRef)();  
  13.     STDMETHOD_(ULONG, Release)();  
  14. //IMath  
  15. public:  
  16.     STDMETHOD(Add)(long nAdd1, long nAdd2, long* pnAdd);  
  17.     STDMETHOD(Sub)(long nSub1, long nSub2, long* pnSub);  
  18. //  
  19. public:  
  20.     LONG m_nRef;  
  21. };  

CimpMath.cpp

  1. #include "stdafx.h"  
  2. #include "ClmpMath.h"  
  3.   
  4.   
  5. ClmpMath::ClmpMath()  
  6. {  
  7.     m_nRef = 0;  
  8. }  
  9.   
  10.   
  11. ClmpMath::~ClmpMath()  
  12. {  
  13. }  
  14.   
  15. STDMETHODIMP ClmpMath::QueryInterface(  
  16.     REFIID iid, LPVOID* ppiObject)  
  17. {  
  18.     if (iid == IID_IUnknown)  
  19.     {  
  20.         *ppiObject = static_cast<IUnknown*>(this);  
  21.     }  
  22.     else if (iid == IID_IMath)  
  23.     {  
  24.         *ppiObject = static_cast<IMath*>(this);  
  25.     }  
  26.     else  
  27.     {  
  28.         *ppiObject = NULL;  
  29.         return E_NOINTERFACE;  
  30.     }  
  31.     AddRef();  
  32.     return S_OK;  
  33. }  
  34.   
  35. STDMETHODIMP_(ULONG)ClmpMath:: AddRef()  
  36. {  
  37.     InterlockedIncrement(&m_nRef);  
  38.     return m_nRef;  
  39. }  
  40. STDMETHODIMP_(ULONG)ClmpMath::Release()  
  41. {  
  42.     InterlockedDecrement(&m_nRef);  
  43.     if (m_nRef == 0)  
  44.     {  
  45.         delete this;  
  46.     }  
  47.     return m_nRef;  
  48. }  
  49.   
  50. STDMETHODIMP ClmpMath::Add(  
  51.     long nAdd1, long nAdd2, long* pnAdd)  
  52. {  
  53.     if (pnAdd == NULL)  
  54.     {  
  55.         return E_POINTER;  
  56.     }  
  57.     *pnAdd = nAdd1 + nAdd2;  
  58.     return S_OK;  
  59. }  
  60. STDMETHODIMP ClmpMath::Sub(  
  61.     long nSub1, long nSub2, long* pnSub)  
  62. {  
  63.   
  64.     if (pnSub == NULL)  
  65.     {  
  66.         return E_POINTER;  
  67.     }  
  68.     *pnSub = nSub1 + nSub2;  
  69.     return S_OK;  
  70. }  

组件创建函数

  1. IUnknown* CreateInstanceEx(CLSID clsid)  
  2. {//判断组件的CLSID  
  3.     if (clsid == CLSID_Math)  
  4.     {  
  5.         //创建对象  
  6.         ClmpMath* pMath = new ClmpMath;  
  7.         //获取接口  
  8.         IUnknown* piUnknown = NULL;  
  9.         pMath->QueryInterface(IID_IUnknown,  
  10.             (LPVOID*)&piUnknown);  
  11.         //返回接口  
  12.         return NULL;  
  13.     }  
  14.   
  15.     return FALSE;  
  16. } 
接口定义语言idl——thrift idl-结构化接口定义语言已成为rpc服务主要的生成方式。 阅读详情

相关推荐

COM接口

COM 接口什么是 COM?接口的结构与描述使用 C++/C/Delphi 描述接口IDL接口的标识COM 数据类型MIDL 编译器IUnknown 接口接口继承接口查询规则 什么是 COM? COM 全称为 Component Object Model,是微软为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在 COM 构架下,人们可以开发出各种各样的功能专一的组件,然后...

Blueware多媒体之窗 1万+

IDL接口描述语言和COM接口COM组件

接口描述语言(Interface description language,缩写IDL) c++写的接口,只能c++和c识别,为了接口的通用性,让所有的语言都通用的定义使用接口 引入IDL,使用IDL定义接口以后,用MIDL编译为c++可用的接口定义   7 接口描述语言 - IDL(Interface Definition Language )    7.1 IDL和MIDL

Barry的博客 7095

IDL如何生成接口,以及与各种编程语言的关系

这里讨论的IDL(Interface Definition Language)在COM中用于定义接口和组件,它是一种描述性语言,不依赖于任何编程语言。IDL文件定义了接口、方法、参数和返回值等,然后通过MIDL(Microsoft IDL编译器)编译生成一些代码和文件,这些文件可以被不同编程语言使用。"接口定义语言"是一种用于精确定义软件组件接口的"描述性语言"。它本身不是编程语言,不包含任何实现逻辑。它的核心作用是生成一份所有相关方都能认可的、无歧义的"合同”。

lza_csdn2019的博客 1138

IDL接口定义语言

IDL接口定义语言也叫“接口描述语言”(Interface Description Language),是一个描述软件组件接口的语言规范。IDL用中立语言的方式进行描述,能使软件组件(不同语言编写的)间相互通信。IDL通常用于RPC(Remote Procedure Call,远程过程调用)软件。IDL提供了一个“桥”来连接不同的系统。基于IDL的软件系统包括:Sun公司的ON

chszs的专栏 8445

COM开发指南(2)—COM接口类

1 标准COM接口1.1 IUnknow1.1.1 定义1.1.2 实现   正如之前在讨论COM技术架构时所说,COM组件服务端部分包含COM接口类,COM组件类以及COM工厂类,其中COM组件类是去继承并实现COM接口类的,COM工厂类是创建COM组件类对象的。 本节将会着重讨论COM接口类,以及用户是如何COM组件类来调用COM接口类中的函数的。COM接口类是开发者在COM DLL中定义的,封装了提供给用户调用的函数的C++接口类(只包含纯虚函数的类),这些接口类在COM DLL中会使用另一种类(C.

西渣渣的博客 3868

IDL详解

IDL详解

hdduuyf的博客 2848

自动化(Automation)基础概念:接口描述语言(IDL)与类型库(TypeLib)

自动化(Automation)基础概念:接口描述语言(IDL)与类型库(TypeLib)许式伟 (版权声明)2007-4-26在前文,我们已经解释了: 自动化(Automation)基础概念:COM组件(Component)与接口(Interface)  自动化(Automation)基础概念:变体(Variant)与Dispatch调用(IDispatch)  

QBox/Golang/CERL/StdExt/TPL/WinxGui - 许式伟的专栏 1万+

6、COM 组件开发中的接口定义语言(IDL)详解

本文详细解析了COM组件开发中的接口定义语言(IDL),探讨了其在解决传统复用问题、实现远程透明性、编程语言独立性等方面的重要作用。文章还介绍了COM的基础概念和技术应用,包括全局唯一标识符(GUID)、类型库的作用、内存管理的最佳实践等。最后,对COM开发的未来发展趋势进行了展望,旨在为开发者提供全面的参考和指导。

k8s6orchestrator的博客 150

COM组件第二部分(GUID,IDL,接口与IUnknown关系,以及COM对象和COM库)

一、UUID 通过特定的算法将主机和时间印鉴结合起来得到的数值; 组件对UUID的使用得到的叫做GUID; 如果我们用GUID唯一的表示组件的类,又叫做CLSID 如果我们用GUID唯一的表示组件的接口,又叫做IID GUID的产生方法: 1.GUIDGEN.exe 2.HRESULT CoCreateGuid (GUID * pguid …(typedef) 二、IDL 是组件的核心部分,...

KingOfMyHeart的博客 1391

深入理解并演示IDL:创建和使用COM组件

上面的IDL文件定义了一个简单的接口ISample,它有一个名为的方法,接受一个long类型的参数。此方法的实现将会在后续章节中详细讲解,但首先,理解IDL定义的结构是至关重要的。在本章的后续部分,我们将探讨如何编译这个IDL文件,并进一步理解它的应用。为了实现这个接口,你需要使用支持COM开发的语言,如C++、C#或Java,并利用相应的工具,比如MIDL,来编译IDL文件生成代理和存根代码,以便在你的应用程序中使用。

weixin_28746213的博客 968

IDL接口定义语言的C++11语言映射规范(v1.0)

C++ 11映射试图避免限制ORB开发人员的实现自由。对于每个OMG IDL构造,C++ 11映射解释使用C++ 11的构造的语法和语义。如果客户机或服务器程序使用C++ 11映射子句中所描述的结构,则符合此映射(是C++ 11)。

接口定义语言IDL,COM

接口定义语言MIDL:Microsoft Interface Definition Language。

xinqingwuji的博客 2389

2024秋招,腾讯测试与质量管理工程师一面

家人们,秋招都开奖了吗,拿到自己心仪的offer了吗,还是在准备明年的春招呢?今天我记录一下,之前面试腾讯测开的一面过程面试官人非常好,我回答中有问题的地方,及时帮我指正同时耐心回答我的反问只可惜我当时的能力不足以达到鹅厂的标准,遗憾错过。

chowley的博客 1059

COM - COM的简单介绍

在此文章记录一下 COM 的简单介绍,包括 COM 相关技术要点以及编程的过程,方便以后查阅。

bailang_zhizun的博客 4310

SP贴图高效导入Maya:从材质设置到渲染优化的完整流程

本文详细解析了将Substance Painter(SP)贴图高效导入Maya并配合Arnold渲染器的完整工作流。针对SP贴图在Maya中常见的色彩、法线等问题,核心在于对齐两者的PBR“语言”,重点讲解了SP中正确的贴图导出设置(包括色彩空间)以及在Maya中连接aiStandardSurface材质、处理法线贴图、优化渲染的标准化流程,确保材质效果准确无误。

weixin_29201933的博客 555

LPC546xx USB接口VBUS阈值设计:从原理到实践,解决冷启动与可靠性问题

在嵌入式USB接口设计中,VBUS信号不仅是电源线,更是设备连接检测与电源管理的核心。其电压阈值直接决定了USB物理层(PHY)能否正确识别主机并建立有效会话。理解VBUS的会话有效电压(Votg_sess_valid)与PHY有效电压(VBUS_valid)等关键参数,是确保接口稳定性的基础。这些参数影响着设备枚举的成功率、通信稳定性以及长期可靠性。在工程实践中,尤其是对于集成PHY的微控制器如NPC LPC546xx系列,VBUS的连接方案(直接连接或通过稳压器)需要根据设备供电模式(自供电/总线供电)

weixin_30915275的博客 402

ATL/COM----IDL和MIDL之详解

IDL是接口定义语言。MIDL是Microsoft的IDL编译器。在用IDL对接口和组件进行了描述后,可以用MIDL进行编译,生成相应的代理和存根DLL的C代码。 import “unknown.idl”  ///Interface IX [         object,         uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682), 

发展是曲折的但也是前进的 4119

Blender关于GIS安装及使用天地图

Blender下载安装及GIS插件的安装及使用

Miss_SQ的博客 6972

IDL文件详解[转]

IDL文件详解[转] ���¼���ԭʼ��ҳ��ӡ IDL详解 - Alex_ - 博客园 Question: 什么是IDL和MIDL? Answer: IDL是接口定义语言。 MIDL是Microsoft的IDL编译器。 在用IDL对接口和组件进行了描述后,可以用MIDL进行编译,生成相应的代理和存根DLL的C代码...

bianchengjingling22的博客 1万+

Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程

本文主要介绍了Codex 调试记录获取完全指南:日志查看、工具调用与实战排查教程,希望能对使用Codex的同学们有所帮助。 文章目录 1. 背景 2. 实战教程

weixin_43178406的博客 6万+

基于Simulink的H∞鲁棒控制器设计与仿真建模示例

本文介绍了基于Simulink的H∞鲁棒控制器设计与仿真方法。针对质量-弹簧-阻尼系统存在±50%刚度不确定性的问题,详细阐述了从构建广义被控对象、设计性能加权函数,到使用hinfsyn综合控制器的完整流程。通过Simulink仿真验证,所设计的H∞控制器在参数摄动和外部扰动下均保持良好性能,位移控制误差小于2%,扰动衰减超过20dB。相比传统PID控制,H∞方法展现出显著鲁棒性优势。文章还总结了工程实践中的加权函数调参技巧、控制器降阶方法,并展望了μ-综合等扩展方向,为处理系统不确定性提供了实用解决方案。

amy_mhd的博客 70
上一篇: linux: ctrl+组合
下一篇: idl:语法详解
nedwons
博客等级 码龄9年 311粉丝 572原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值