IDL 文件基础知识






3.63/5 (23投票s)
本文介绍了IDL文件的基础知识。
引言
MIDL(Microsoft接口定义语言)用于描述COM对象。包含接口和类型库定义的文件称为IDL文件,其文件扩展名为.idl。
接口定义语言(IDL)不是一种编程语言,而是一种描述对象所实现接口的描述性语言。IDL文件类似于C++头文件。
IDL文件的内容
在任何IDL文件中,可以定义一个或多个作为模块一部分的接口定义。 每个接口定义由接口标头和接口主体组成。 IDL接口标头指定有关整个接口的信息。
IDL接口主体包含远程过程调用中使用的数据类型以及远程过程的函数原型。 接口主体还可以包含导入、编译指示、常量声明和类型声明。(每个接口主体可以包含方法、属性、变量/常量、枚举等。换句话说,需要从接口公开的所有内容都将存在于IDL文件中。)
IDL文件的结构
[ //header //Interface attributes go here. ] interface INTERFACENAME //body { //The interface body goes here. } library TyeLibraryFileName { //Type library Information }
接口标头示例
[
object,
uuid(C0E20128-DB19-4DB3-BCA1-24595E5E24A8),
dual,
nonextensible,
helpstring("IConfig Interface"),
pointer_default(unique)
]
接口标头包含与平台无关的属性。 接口标头中的属性对于整个接口是全局的。 这些属性用方括号括起来,位于接口定义的开头。 每个属性都有其自身的含义
Object
:表示它是COM接口。Uuid
:表示一个全局唯一标识符(UUID),该标识符分配给该接口并将其与其他接口区分开。 每个接口、类和类型库都必须使用其自身的唯一标识符进行标识。Dual
:dual
属性标识通过IDispatch
和VTBL公开属性和方法的接口。Nonextensible
:指定IDispatch
实现仅包括接口描述中列出的属性和方法,并且无法在运行时使用其他成员进行扩展。Helpstring
:用于描述其所应用元素的字符串。Pointer_default
:指定所有指针(除了参数列表中显示的顶级指针之外)的默认指针属性。
更多信息:MSDN。
接口主体示例
interface ILogManager : IDispatch { [id(1), helpstring("Initializes ILogManager")] HRESULT Initialize([in] IConfig* Config); [id(2), helpstring("Logs MemberClaims")] HRESULT LogMemberClaims([in] IMember* Member); [id(3), helpstring("Logs ILogData to specified destination")] HRESULT Log([in] ILogData* LogData); };
ILogManager
– 接口名称。IDispatch
– COM基类。Id(1)
– 该方法的唯一ID。Helpstring
- 描述此方法的字符串。HRESULT
– 返回错误代码。Initialize
– 方法名称。In
– 指定要从调用过程传递到被调用过程的参数。Out
- 指定传递回调用方的数据的参数。 在一个参数上同时使用两个定向属性指定该参数既用于将数据发送到方法,又用于将数据传递回调用方。
类型库
类型库是组件的重要组成部分,它向编译器提供有关组件中包含的类、接口、枚举等信息。 类型库文件的扩展名为.tlb。
类型库示例
library MyTypeLibraryFileLib { [ uuid(B3F6C9C4-26AE-451B-9788-75F6C648DBF4), helpstring("LogManager Class") ] coclass LogManager { [default] interface ILogManager; }; }
library语句定义了MyTypeLibraryFileLib
类型库,它具有自己的uuid
、helpstring
和版本属性。 coclass
语句定义了一个全新的组件类LogManager
,它包含一个先前定义的接口ILogManager
。
MIDL编译器
MIDL编译器处理IDL文件并创建类型库、头文件和代理文件。
类型库是一个描述COM对象或COM接口(或两者)的二进制文件。
从IDL文件创建TLB文件
保存IDL文件,然后使用MIDL编译器生成TLB文件。 从命令行,输入
midl myfilectl.idl /tlb myfilectl.tlb
“/h”开关还将生成一个C/C++头文件。
历史
- 版本1.0 - 创建于2007年7月15日。