自动化(Automation)基础概念:接口描述语言(IDL)与类型库(TypeLib)

自动化(Automation)基础概念:接口描述语言(IDL)与类型库(TypeLib)

许式伟 (版权声明)
2007-4-26

在前文,我们已经解释了:

  • 自动化(Automation)基础概念:COM组件(Component)与接口(Interface) 
  • 自动化(Automation)基础概念:变体(Variant)与Dispatch调用(IDispatch)  
  • 自动化(Automation)基础概念:二次开发接口(API)与插件(Addin)

接下来,让我们来解释两个同样常见的词:

  • 接口描述语言(IDL)
  • 类型库(TypeLib)

前文我们已经解释了二次开发接口(API),它是应用程序用来向外部程序(或插件)提供服务的。我们理一下思路:

  • 应用程序是一个EXE形式的COM组件(EXE COM Server)。
  • 应用程序对外提供接口(Interface),也就是我们通常说的二次开发接口(API)。
  • 为了支持更多的使用者,特别是支持一些脚本语言,应用程序的二次开发接口(API)通常被设计为双接口。

清楚了这些,剩下来的问题是:既然应用程序API是接口,是一种二进制协议,那么,第三方如何知道应用程序提供的接口是什么样子的呢?这就是本文要回答的内容。

每一种语言的模块,为了可以被用来提供给其他模块调用,都有自己固有的习惯。例如,C/C++程序员很习惯对外提供一个.dll/.so,外加一个.h文件对接口进行描述(有时还会带上一个.lib文件,不过这里我们假设.dll总是提供了标准的COM组件,那么.lib是不需要的)。

为了是的应用程序提供的接口可以让更多人可以使用,为了使任意语言的程序员能彼此理解对方,理解对方的API接口(DOM模型的对象树),就需要有统一的规范。我们需要借助一种中间语言对接口进行描述,这就是接口描述语言(IDL)的由来。

那么类型库(TypeLib)又是什么呢?有人说,类型库(TypeLib)是IDL编译后的结果,IDL是基于纯文本的,可以方便人们阅读,而类型库(TypeLib)是二进制的,方便机器处理。

这么说当然没有错。但是并没有解释类型库(TypeLib)存在的价值。

我个人认为,类型库(TypeLib)最重要的作用是充当了元信息(Meta)的作用,你可以认为这是一种规范化的RTTI。从此意义上来讲,我们不难明白,为什么MS认为.NET是COM的延续 —— 类型库(TypeLib)所能够描述的元信息(Meta)仍然不够丰富,语言之间的壁垒仍然存在。

类型库(TypeLib)的主要作用在于:

  • RTTI - 为运行时刻动态获得某种对象接口的元信息(Meta)提供可能。通过类型库(TypeLib),你可以很轻松获得类(或接口)的种种信息,如:
    • 类名 
    • 基类
    • 方法列表(包括方法的原型,方法的名称)
    • 属性列表(包括属性的类型,属性的名称)
    • 等等
  • 通过这种RTTI,为程序员提供各种服务。例如:
    • 自动实现双接口中的IDispatch接口。
    • Visual Basic集成环境(或其他IDE环境)提供的自动完成(只要你加载了TypeLib)。
    • 根据TypeLib进行自动代码生成(如MFC程序可以导入一个TypeLib自动为其生成相应的C++头文件/Wrapper源代码)等。
  • 由于类型库(TypeLib)包含了接口的完整信息,它一定程度上起到取代IDL或.h文件的作用。考虑到TypeLib可以作为应用程序的资源存在,这样我们发布程序的时候,就不需要无谓再带上IDL或者提供额外的.h文件。

相信你已经很清楚IDL和TypeLib这两个重要概念了。我这里提供一个CodeGuru(这里作了修正。抱歉,我记忆成CodeProject了)上的一个例程结束本文。该程序枚举类型库(TypeLib)中的信息,并将其打印出来,略微改变一下,应该可以做出一个实际可用的应用程序。相信有人需要,希望对你有帮助。到这里下载:TypeLibEnum.rar。 

补充:如果你只是要查看类型库(TypeLib)——事实上,多数人属于这种情况,而不是编程对它进行操作,那么你可以:

  • 通过Visual Studio(我知道VS 6.0版本有,更高版本未确认)带的OLE View(全称是OLE/COM Object Viewer)进行查看。File菜单下有View TypeLib...选项。当然哪些已经注册到系统的TypeLib,已经直接列出来了。
  • 通过Microsoft提供的各种对象浏览器查看。对象浏览器在很多MS的产品中都带了,例如Visual Basic 6.0,包含VBA支持的应用程序(如Word/Excel/PowerPoint等等),Visual Studio 2005,等等。

你可能感兴趣的:(自动化(Automation)基础概念:接口描述语言(IDL)与类型库(TypeLib))