首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是IDL?

什么是IDL?
EN

Stack Overflow用户
提问于 2009-03-22 06:55:49
回答 6查看 46.4K关注 0票数 62

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-03-22 07:58:06

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

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

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

代码语言:javascript
复制
+----------------+
| Client         |
|  +----------+  |         +---------------+
|  |   main   |  |         | Server        |
|  |----------|  |         |  +----------+ |
|  | stub_cli |----(comms)--->| stub_svr | |
|  +----------+  |         |  |----------| |
+----------------+         |  | function | |
                           |  +----------+ |
                           +---------------+

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

这可以是同一台机器,也可以是不同的机器,这并不重要- RPC的优势之一是能够随意移动服务器。

在服务器中,有一个'listener‘进程,它将接收该信息并将其传递给服务器。服务器的存根接收信息,将其解包并将其传递给真正的函数。

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

客户端存根随后将其解包,并将其传递回main

实际细节可能略有不同,但对于概念性概述来说,这种解释应该足够好了。

实际的IDL可能如下所示:

代码语言:javascript
复制
[   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客户机和服务器存根函数,用于编译和链接您的客户机和服务器代码以使其工作。

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

票数 103
EN

Stack Overflow用户

发布于 2009-03-23 03:58:01

还有一个Interactive Data Language,我曾经做过一份用于科学数据分析的工作,但可能从上下文中你很清楚这不是这个IDL所代表的。

票数 10
EN

Stack Overflow用户

发布于 2014-11-24 02:10:14

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

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

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

Microsoft使用一种带有COM对象的IDL方言,Microsoft IDL与CORBA IDL不同,尽管它们有相似之处,因为它们具有共同的语言根源。IDL文件包含COM对象支持的接口的说明。COM允许创建进程内服务(可以使用RPC或直接DLL调用)或进程外服务(使用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对话框项目来对其进行测试。对COM控件使用ATL隐藏了相当多的细节,您可以在以后研究这些细节,简单的MFC对话框项目提供了一种创建容器的简单方法。您还可以使用Visual Studio中提供的ActiveX控件测试容器工具进行初步测试,并查看方法和属性是如何工作的。

在codeproject.com等网站上也有许多示例项目。例如,这里是one using C to expose all the ugly plumbing behind COM,这里是one using C++ without ATL

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/670630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档