62

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

4

6 回答 6

103

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

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

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

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

在这个例子中,不是function在同一个程序中调用,而是main调用一个客户端存根函数(具有与 相同的原型function),该函数负责打包信息并通过 comms 通道将其通过线路传递到另一个进程。

这可以是同一台机器或不同的机器,这并不重要 - 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。

于 2009-03-22T07:58:05.617 回答
10

还有一种交互式数据语言,我有一份工作用于科学数据分析,但也许从上下文来看,你很清楚这不是 IDL 所代表的。

于 2009-03-23T03:58:01.097 回答
5

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

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

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

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

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

数据编组基本上意味着存根获取客户端提供的数据,将其打包并将其发送到执行某些操作并将数据发送回的服务。这种数据的发送和接收可能是通过一些 RPC 服务或通过直接的 DLL 函数调用。来自服务的响应被翻译成适合客户端的形式,然后提供给客户端。所以基本上,编组功能是客户端和服务之间的适配器(参见适配器设计模式)桥接器(参见桥接设计模式) 。

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

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

于 2014-11-23T18:10:14.410 回答
1

它是一种在 COM 时代用于以(据称)与语言无关的方式定义接口的语言。

于 2009-03-22T07:56:23.047 回答
1

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

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

于 2009-03-23T03:58:52.343 回答
0

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

链接上有 IDL 基础知识的非常好的文章

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

于 2016-03-04T17:23:13.433 回答