什么是IDL?
IDL是什么意思? 我用googlesearch了一下,发现它代表接口定义语言,它用于组件的接口定义。 但是,在实践中,IDL的目的是什么? 微软是否使用它?
接口定义语言(IDL)用于在远程过程调用(RPC)中build立客户端和服务器之间的通信。 已经有很多变种,如Sun RPC,ONC RPC,DCE RPC等等。
基本上,您使用IDL来指定客户端和服务器之间的接口,以便RPC机制可以创build在networking上调用函数所需的代码存根。
RPC需要使用IDL信息为客户端和服务器创build存根函数。 它与C中的函数原型非常相似,但最终结果稍有不同,例如:
+----------------+ | Client | | +----------+ | +---------------+ | | main | | | Server | | |----------| | | +----------+ | | | stub_cli |------->| stub_svr | | | +----------+ | | |----------| | +----------------+ | | function | | | +----------+ | +---------------+
在这个例子中, main
不是调用同一个程序中的function
,而是main
调用一个客户端存根函数(与function
原型相同),负责打包信息并通过networking传递给另一个进程。 这可以是同一台机器,也可以是一台不同的机器,这并不重要 – RPC的优点之一是可以随意移动服务器。
在服务器中,有一个“侦听器”进程将接收这些信息并将其传递给服务器。 服务器的存根(stub)接收信息,将其解包并传递给实际function。
然后真正的函数做它所需要的,然后返回到可以打包返回信息(包括返回代码和任何[out]
或[in,out]
variables)的服务器存根,并将其传回给客户端存根。
客户端存根然后解包并将其传递回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 ); }
所有在顶部的东西基本上是networking信息,它的肉是在原型显示的接口部分内。 这允许IDL编译器构buildx stub和x服务器函数,用于编译和链接客户端和服务器代码以使RPC工作。
微软确实使用IDL(我认为他们有一个MIDL编译器)的东西。 我也使用MS操作系统的第三方产品,包括DCE和ONC RPC。
我也有一种交互式数据语言用于科学数据分析,但也许从上下文来看,很明显,这不是IDL所代表的。
IDL是接口定义语言 ( Interface Definition Language )的首字母缩略词,取决于定义语言的供应商或标准组,它有几种不同的变体。 IDL的目标是描述一些服务的接口,以便希望使用该服务的客户端将知道接口和服务提供了什么方法和属性。 IDL通常与二进制接口一起使用,IDL语言文件描述二进制接口中使用的数据types。
对于二进制组件(通常是COTS或商业现货)有几种不同的标准,以及客户端与二进制组件的通信方式可能会有所不同,尽pipe传统上使用某种版本的远程过程调用或RPC 。 两个这样的标准是Microsoft公共对象模型或COM标准和公共对象请求代理或CORBA标准 。 还有其他一些组件的标准,例如Firefox插件或者其他应用程序的插件,比如Visual Studio本身,但是这些标准并不一定使用某种forms的接口描述语言,而是使用某种软件开发工具包或SDK,一个API。
IDL所允许的是能够创build提供各种服务的组件的更大程度的灵活性,由于其二进制特性,可以使用各种不同的编程语言和各种不同的环境。
Microsoft使用COM对象的IDL方言,而Microsoft IDL与CORBA IDL不同,尽pipe它们具有相似之处,因为它们具有共同的语言根。 IDL文件包含COM对象支持的接口的描述。 COM允许创build进程服务(可能使用RPC或直接DLL调用)或进程外服务(使用RPC)。 COM背后的想法是客户端只需要知道组件的标识符以及接口就可以使用它。 客户端请求COM对象,然后从COM对象的工厂请求一个类对象,它支持客户端要使用的接口,然后通过该接口使用COM对象。
Microsoft提供了处理IDL文件的MIDL编译器,用于生成types库,向COM对象的用户提供有关该接口的信息,以及通过客户端和服务之间的接口封送数据所需的存根。
对数据进行封送基本上意味着存根将客户端提供的数据打包并发送给执行某些操作的服务并发回数据。 这种数据的发送和接收可能通过一些RPC服务或通过直接的DLL函数调用。 服务的响应被翻译成适合客户的表格,然后提供给客户。 所以基本上,编组function是客户端和服务之间的适配器(请参阅适配器devise模式)或桥接(请参阅桥接devise模式) 。
Visual Studio,我的经验是用C ++,包含一些可用于生成示例的向导,以便您可以玩这个。 如果你感兴趣,你可以创build一个工作空间,然后在工作空间中创build一个ATL项目来生成控件,然后创build一个简单的MFC对话框项目来testing它。 使用ATL为您的COM控件隐藏了一些可以稍后调查的细节,简单的MFC对话框项目提供了一种创build容器的简单方法。 您还可以使用Visual Studio中提供的ActiveX控件testing容器工具来进行初步testing,并查看方法和属性是如何工作的。
网站上还有一些示例项目,如codeproject.com。 比如这里有一个使用C来暴露COM背后所有丑陋的pipe道 ,这里是一个使用C ++没有ATL的 。
这是一种在COM时代用来以一种(所谓的)语言中立的方式定义接口的语言。
它定义了用于与另一个应用程序中的公开服务进行通信的接口。
如果您使用SOAP,您将了解WSDL。 WSDL是IDL的另一种forms。 IDL通常是指Microsoft COM或CORBA IDL。
IDL至关重要2例。 1.为exe服务器创build代理/存根dll。 2.为自动化服务器创buildtypes库。
链接上有很好的关于IDL基础的文章
为了研究IDL,最好是阅读编译器自己的idl头文件,这些头文件包含了VC ++包的子目录。