转载 ATL/COM----IDL和MIDL之详解收藏

新一篇: 分布式操作系统,批处理,分时,实时操作系统 | 旧一篇: 手机的操作系统

IDL是接口定义语言。MIDL是Microsoft的IDL编译器。在用IDL对接口和组件进行了描述后,可以用MIDL进行编译,生成相应的代理和存根DLL的C代码。


import “unknown.idl”
///Interface IX

      object, 
      uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682), 
      helpstring(“IX Interface”), 
      pointer_default(unique)
]


interface IX:IUnknown
{

      HRESULT FxStringIn([in,string]wchar_t* szIn);
      HRESULT FxStringOut([out,string]wchar_t* szout);

}

import

用于将其他idl文件中的定义包含到当前文件中。

 

object:

      表示所定义的接口是一个COM接口,关键字object是Microsoft对于IDL的一种扩展;

uuid(32bb8323-b41b-11cf-a6bb-0080c7b2d682):

      表示相应的IID;

helpstring(“IX Interface”):

      将一个帮助串放到一个类型库中;

pointer_default(unique) :

      告诉MIDL编译器在没有为指针指定其他属性的时候如何处理该指针;可以当作引用、指针或空等,具体参见《COM技术内幕》第204页;

 

in关键字告诉MIDL需要将此参数值从客户传递给组件,存根代码不需要送回任何值。

out关键字告诉MIDL参数仅被用来从组件向客户传回有关的数据,

COM对字符串的标准约定是Unicode字符(即wchar_t);IDL文件可以定义C和C++风格的结构,并可用它们作为函数的参数。


当IDL文件中有一个library时,MIDL将生成一个类型库。L为接口生成相应的代理和存根的C代码。
为得到一个代理/存根DLL,需要编译和链接MIDL生成的C文件。
宏REGISTER_PROXY_DLL将完成代理/存根DLL在注册表中的注册操作。
有了IDL和MIDL我们就可以象调用进程内组件那样进行跨进程边界的函数调用,并对参数进行列集。

当IDL文件定义了library的时候,MIDL将会生成一个类型库,该类型库包括了在library block中每个元素的定义,以及在block外定义但在该bloack中引用元素的定义。

You can use a single IDL file to generate both the proxy stubs and header files for marshaling code, and a type library. You do this by defining an interface outside the library block and then referencing that interface from inside the library block.

 

 MIDL编译器将生成XX.H XX_.C XX_P.C DLLDATA.C几个文件,其作用分别为:
XX.H       一个同C和C++兼容的,包含IDL中所描述的所有接口声明的头文件;
XX_.C     一个定义有IDL文件中所用的所有GUID的C文件
XX_P.C     一个实现IDL文件中接口的代理及残根的C文件
DLLDATA.C 一个包含代理和残根的DLL的C文件
---------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
import "unknwn.idl"; 
[ object,uuid(9955EBD9-C24D-4b18-9D88-D6049ADDCBC8) ]
interface ICalculator : IUnknown {
 HRESULT Add ( [in] long v1, [in] long v2, [out, retval] long* pVal );
 HRESULT Subtract ( [in] long v1, [in] long v2, [out, retval] long* pVal );
 HRESULT Multiply ( [in] long v1, [in] long v2, [out, retval] long* pVal );
 HRESULT Divide ( [in] long v1, [in] long v2, [out, retval] long* pVal );
}
 
[ uuid(F1B9F274-5B16-4033-BECD-9C05BB6072AE) ]
library CalcualtorLib
{  
 [ uuid(0A6C37B3-3577-48a7-9485-5F10ED190ECF) ]
 coclass CCalculator
 { 
  interface ICalculator;
 }
};
笔者在编译上面的IDL文件时,产生下列错误:
D:\Work\Math\Calculator.idl(3) : error MIDL2311 : statements outside library block are illegal in mktyplib compatability mode : [ Interface 'ICalculator'  ]
D:\Work\Math\Calculator.idl(3) : error MIDL2096 : duplicated attribute : [uuid] [ Interface 'ICalculator'  ]
Error executing midl.exe.
察看MSDN,发现原因是:
   需要在project中将IDL文件的MIDL/mktyplib203选项去掉.
 

发表于 @ 2007年04月11日 13:46:00|评论(loading...)|编辑

新一篇: 分布式操作系统,批处理,分时,实时操作系统 | 旧一篇: 手机的操作系统

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © scmcopew