什么是IDL?

时间:2009-03-22 06:55:49

标签: idl

IDL是什么意思?我用谷歌搜索了它,发现它代表接口定义语言,它用于组件的接口定义。但是,在实践中,IDL的目的是什么?微软是否使用它?

6 个答案:

答案 0 :(得分:70)

接口定义语言(IDL)用于在远程过程调用(RPC)中设置客户端和服务器之间的通信。这有很多变化,如Sun RPC,ONC RPC,DCE RPC等。

基本上,您使用IDL指定客户端和服务器之间的接口,以便RPC机制可以创建在网络上调用函数所需的代码存根。

RPC需要使用IDL信息为客户端和服务器创建存根函数。它与C中的函数原型非常相似,但最终结果略有不同,例如:

+----------------+
| Client         |
|  +----------+  |  +---------------+
|  |   main   |  |  | Server        |
|  |----------|  |  |  +----------+ |
|  | stub_cli |------->| stub_svr | |
|  +----------+  |  |  |----------| |
+----------------+  |  | function | |
                    |  +----------+ |
                    +---------------+

在此示例中,function不是在同一程序中调用main,而是调用客户端存根函数(与function具有相同的原型),该函数负责打包信息并通过电线将其传送到另一个进程。这可能是同一台机器或不同的机器,它并不重要 - RPC的一个优点是能够随意移动服务器。

在服务器中,有一个“监听器”进程,它将接收该信息并将其传递给服务器。服务器的存根接收信息,解压缩并将其传递给实际函数。

然后真正的函数执行它需要的操作并返回到服务器存根,它可以打包返回信息(返回代码和任何[out][in,out]变量)并将其传递回客户存根。

客户端存根然后解压缩并将其传递回main

实际细节可能略有不同,但该解释应该足以概念化概述。

实际IDL可能如下所示:

[uuid(f9f6be21-fd32-5577-8f2d-0800132bd567),
    version(0),
    endpoint("ncadg_ip_udp:[1234]", "dds:[19]")]
interface function_iface {
    [idempotent] void function(
        [in] int handle,
        [out] int *status
    );
}

顶部的所有内容基本上都是网络信息,它的内容在显示原型的界面部分内。这允许IDL编译器构建x stub和x server函数,用于编译和链接客户端和服务器代码以使RPC工作。

Microsoft确实使用IDL(我认为他们有一个MIDL编译器)用于COM的东西。我还使用了MS操作系统的第三方产品,包括DCE和ONC RPC。

答案 1 :(得分:10)

我还有Interactive Data Language用于科学数据分析的工作,但也许从上下文中可以清楚地知道这不是IDL所代表的。

答案 2 :(得分:5)

IDL是Interface Definition Language的首字母缩写,其中有多种变体,具体取决于定义语言的供应商或标准组。 IDL的目标是描述某些服务的接口,以便希望使用该服务的客户端知道该接口和服务提供的方法和属性。 IDL通常与二进制接口一起使用,IDL语言文件描述二进制接口中使用的数据类型。

二进制组件有几种不同的标准,通常为COTS or Commercial Off The Shelf,客户端与二进制组件的通信方式可能会有所不同,但传统上使用的是某些版本的Remote Procedure Call or RPCMicrosoft Common Object Model or COM standardCommon Object Request Broker or CORBA standard有两个这样的标准。对于诸如Firefox plugins之类的组件或其他应用程序(如Visual Studio本身)的插件还有其他标准,但是这些不一定使用某种形式的接口描述语言而是使用某种类型的软件开发工具包或具有标准化和良好的SDK已知的API接口。

IDL允许的更大程度的灵活性是能够创建提供各种服务的组件,由于它们的二进制特性,可以与各种不同的编程语言和各种不同的环境一起使用。 / p>

Microsoft使用IDL与COM对象的方言,并且Microsoft IDL与CORBA IDL不同,尽管它们有相似之处,因为它们共享公共语言根。 IDL文件包含COM对象支持的接口的描述。 COM允许创建In Process服务(可以使用RPC,或直接DLL调用)或Out of Process服务(使用RPC)。 COM背后的想法是客户端只需要知道组件的标识符以及能够使用它的接口。客户端请求COM对象然后从COM对象的工厂请求一个类对象,该工厂支持客户端想要使用的接口,然后通过该接口使用COM对象。

Microsoft提供了MIDL编译器,它处理IDL文件以生成类型库,向COM对象的用户提供有关接口的信息,以及在客户端和服务之间的接口上编组数据所需的存根。

数据封送基本上意味着存根获取客户端提供的数据,将其打包并将其发送到执行某些操作并将数据发回的服务。这种数据的发送和接收可以通过一些RPC服务或通过直接的DLL函数调用。来自服务的响应被转换为适合于客户端的形式,然后提供给客户端。因此,编组功能基本上是客户端和服务之间的adapter (see the adapter design pattern)bridge (see the bridge design pattern)

Visual Studio,我的经验是使用C ++,包含许多可用于生成示例的向导,以便您可以使用它。如果您感兴趣,可以创建一个工作区,然后在工作区中创建一个ATL项目来生成一个控件,然后创建一个简单的MFC对话框项目来测试它。使用ATL进行COM控制隐藏了一些您可以稍后调查的细节,简单的MFC对话框项目提供了一种创建容器的简便方法。您还可以使用Visual Studio中提供的ActiveX控件测试容器工具进行初步测试,并查看方法和属性的工作方式。

网站上还有许多示例项目,例如codeproject.com。例如,此处为one using C to expose all the ugly plumbing behind COM,此处为one using C++ without ATL

答案 3 :(得分:1)

这是一种在COM时代用来定义(假设)与语言无关的接口的语言。

答案 4 :(得分:1)

它定义了用于与另一个应用程序中的公开服务进行通信的接口。

如果您使用SOAP,您将了解WSDL。 WSDL是IDL的另一种形式。 IDL通常是指Microsoft COM或CORBA IDL。

答案 5 :(得分:1)

IDL在2例中至关重要。 1.为exe服务器创建代理/存根dll。 2.为自动化服务器创建类型库。

link

有关于IDL基础知识的非常好的文章

要学习IDL,最好阅读编译器自己的idl头文件,这些文件包含VC ++包的子目录。