IDL 是什么?

IDL 是什么意思?我谷歌了一下,发现它是接口定义语言(Interface Definition Language)的缩写,用于组件的接口定义。但是,在实践中,IDL 的目的是什么?微软使用它吗?

51419 次浏览

它是一种在 COM 时代被用来以一种(假定的)语言中立的方式定义接口的语言。

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

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

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

+----------------+
| Client         |
|  +----------+  |         +---------------+
|  |   main   |  |         | Server        |
|  |----------|  |         |  +----------+ |
|  | stub_cli |----(comms)--->| stub_svr | |
|  +----------+  |         |  |----------| |
+----------------+         |  | function | |
|  +----------+ |
+---------------+

在这个例子中,main不是在同一个程序中调用 function,而是调用一个客户机存根函数(与 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
);
}

顶部的所有信息(例如,uuidendpoint)基本上都是用于连接客户机和服务器的网络信息。它的“肉”在接口部分中,原型显示在那里。这允许 IDL 编译器构建 function客户机和服务器存根函数,用于编译和链接客户机和服务器代码以使 RPC 工作。

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

还有一个 交互式数据语言,我曾经用它来进行科学数据分析,但是也许从上下文中可以清楚地看到,这并不是 IDL 所代表的。

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

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

IDL 是 接口定义语言的首字母缩写,根据定义该语言的供应商或标准组的不同,接口定义语言有几个变体。IDL 的目标是描述某些服务的接口,以便希望使用该服务的客户机知道该服务提供的方法和属性、接口。IDL 通常与二进制接口一起使用,IDL 语言文件描述二进制接口中使用的数据类型。

对于二进制组件有几种不同的标准,通常是 现货商品,尽管传统上使用某些版本的 远程过程调用,但客户机与二进制组件通信的方式可能不同。两个这样的标准是 Microsoft 公共对象模型或 COM 标准通用对象请求代理或 CORBA 标准。还有其他标准的组件,如 Firefox 插件或插件的其他应用程序,如 Visual Studio 本身,但这些并不一定使用某种形式的接口描述语言,而是使用某种标准化和众所周知的接口的软件开发工具包或 SDK 的 API。

IDL 所允许的是更大程度的灵活性,可以创建提供各种服务的组件,由于其二进制特性,这些组件可以用于各种不同的编程语言和各种不同的环境。

Microsoft 对 COM 对象使用 IDL 的方言,而 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 函数调用。来自服务的响应被转换成适合客户端的表单,然后提供给客户端。所以基本上封送处理功能是客户机和服务之间的 适配器(参见适配器设计模式)桥梁(参见桥梁设计模式)

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

在诸如 codeproject.com 这样的网站上也有许多示例项目。例如,这里是 一个使用 C 来暴露 COM 背后所有丑陋的管道,这里是 一个使用 C + + 而不使用 ATL

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

链接上有一篇非常好的关于 IDL 基础知识的文章

研究 IDL,最好是读取编译器自己的 IDL 头文件,这些文件是 VC + + 包中的 include 子目录。