![]() |
【转帖】什么是idl和midl
文章原始出处 http://www.ai361.com
原文标题大概是 Notes----《COM技术内幕》 作者 雷神 这是雷神刚刚读完《COM技术内幕》一书,整理的一个FAQ 中的两个: Question: 什么是IDL和MIDL? Answer: IDL是接口定义语言。 MIDL是Microsoft的IDL编译器。 在用IDL对接口和组件进行了描述后,可以用MIDL进行编译,生成相应的代理和存根DLL的C代码。 一个例子: import “unknown.idl” ///用于将其他IDL文件中的定义包含到当前文件中 ///Interface IX [ ///注意是[ ]不是 {} object, ///所定义的接口是一个COM接口 uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682), ///相应的接口IID helpstring(“IX Interface”), ///将帮助串放入类型库 pointer_default(unique) ///这类指针可以为空,函数内可以修改它们的值,但不能指定别名 ] interface IX:IUnknown { ///in关键字告诉MIDL需要将此参数值从客户传递给组件,存根代码不需要送回任何值。 HRESULT FxStringIn([in,string]wchar_t* szIn); ///out关键字告诉MIDL参数仅被用来从组件向客户传回有关的数据, ///代理不需要对输出参数进行列集,也不需要将参数传给组件。 HRESULT FxStringOut([out,string]wchar_t* szout); ///COM对字符串的标准约定是Unicode字符(即wchar_t) } IDL文件可以定义C和C++风格的结构,并可用它们作为函数的参数。 当IDL文件中有一个library时,MIDL将生成一个类型库。 MIDL为接口生成相应的代理和存根的C代码。 为得到一个代理/存根DLL,需要编译和链接MIDL生成的C文件。 宏REGISTER_PROXY_DLL将完成代理/存根DLL在注册表中的注册操作。 有了IDL和MIDL我们就可以象调用进程内组件那样进行跨进程边界的函数调用,并对参数进行列集。 Question: 什么是代理和存根DLL? Answer: 客户与一个模仿组件的DLL进行通信,这个DLL可以完成参数的列集,此组件被称为代理。 一个代理就是同另一个组件行为相同的组件。 代理必须是DLL形式。 组件还需要一个存根的DLL,以便对从客户传来的数据进行散集。 存根也将对传回给客户的数据进行列集。 |
所有的时间均为北京时间。 现在的时间是 02:57 PM. |