IDL是什么意思?我用谷歌搜索了它,发现它代表接口定义语言,它用于组件的接口定义.但是,在实践中,IDL的目的是什么?微软是否使用它?
接口定义语言(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工作.
微软确实使用IDL(我认为他们有一个MIDL编译器)用于COM的东西.我还使用了MS操作系统的第三方产品,包括DCE和ONC RPC.
还有交互式数据语言,我有一份工作用于科学数据分析,但也许从上下文中可以清楚地看出,这不是IDL所代表的.
IDL是接口定义语言的首字母缩写,其中有多种变体,具体取决于定义语言的供应商或标准组.IDL的目标是描述某些服务的接口,以便希望使用该服务的客户端知道该接口和服务提供的方法和属性.IDL通常与二进制接口一起使用,IDL语言文件描述二进制接口中使用的数据类型.
二进制组件有几种不同的标准,通常是COTS或商用现货,以及客户端如何与二进制组件通信可能会有所不同,尽管传统上使用某种版本的远程过程调用或RPC.两个这样的标准是Microsoft公共对象模型或COM标准以及公共对象请求代理或CORBA标准.对于其他应用程序(如Visual Studio本身)的Firefox插件或插件等组件还有其他标准,但是这些不一定使用某种形式的接口描述语言,而是使用某种类型的软件开发工具包或具有标准化和众所周知的接口的SDK.一个API.
IDL允许的是更大程度的灵活性,能够创建提供各种服务的组件,由于它们的二进制特性,可以与各种不同的编程语言和各种不同的环境一起使用.
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函数调用.来自服务的响应被转换为适合于客户端的形式,然后提供给客户端.因此,编组功能基本上是客户端和服务之间的适配器(请参阅适配器设计模式)或桥接(请参阅桥接设计模式).
Visual Studio,我的经验是使用C++,包含许多可用于生成示例的向导,以便您可以使用它.如果您感兴趣,可以创建一个工作区,然后在工作区中创建一个ATL项目来生成一个控件,然后创建一个简单的MFC对话框项目来测试它.使用ATL进行COM控制隐藏了一些您可以稍后调查的细节,简单的MFC对话框项目提供了一种创建容器的简便方法.您还可以使用Visual Studio中提供的ActiveX控件测试容器工具进行初步测试并查看方法和属性的工作方式.
在诸如codeproject.com之类的网站上也有许多示例项目.例如,这里有一个使用C来暴露COM背后的所有丑陋管道,这里有一个使用没有ATL的C++.