COM组件编程—接口定义语言IDL

来源:互联网 发布:冒险岛766最新数据库 编辑:程序博客网 时间:2024/05/27 21:49

通过IDL描述接口,再通过MIDL编译生成代理和残根DLL。

IDL的一个示例:

import "unknwn.idl" ; typedef struct {double x ;double y ;double z ;} Point3d ;interface IZ : IUnknown{HRESULT FzStructIn([in] Point3d pt) ;HRESULT FzStructOut([out] Point3d* pt) ;} ;// 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) ;HRESULT FyCount([out] long* sizeArray) ;HRESULT FyArrayIn([in] long sizeIn,         [in, size_is(sizeIn)] long arrayIn[]) ;HRESULT FyArrayOut([out, in] long* psizeInOut,         [out, size_is(*psizeInOut)] long arrayOut[]) ;        HRESULT FzStructIn([in] Point3d pt) ;HRESULT FzStructOut([out] Point3d* pt) ;[propput]HRESULT Visible([in] VARIANT_BOOL bVisible) ;[propget]HRESULT Visible([out, retval] VARIANT_BOOL *pbVisible) ;} ;library ServerLib{importlib("stdole32.tlb") ;// Component 1[uuid(0c092c29-882c-11cf-a6bb-0080c7b2d682),helpstring("Component 1 Class")]coclass Component1{[default] interface IX ;interface IY ;interface IZ ;};}
其中import 用于包含其他idl文件,相当于include

[]为信息分隔符;
在每一接口前都有一个属性列表,也叫接口头
接口头中
object 表示接口是一个COM接口,这类接口返回值为HRESULT类型,可帮助指定网络错误 (这是微软对IDL的一个扩展)
uuid 为接口对应的IID
helpstring 放入一个帮助字符串
pointer_default 告诉MIDL如何处理指针。
    ref : 把指针当作引用对待 (指针不能为空,总是指向合法地址,调整前后指向同一内存地址)
    unique : 指针可为空,函数内可修改其值,不能指定别名
    ptr : 这是一个C指针,可为空,函数内可修改其值,可指定别名

参数中in, out 代表参数传递方向,可帮助MIDL优化。out参数必须是指针,retval关键字说明哪一个参数应当作为函数的返回值处理。string 代表参数是一个字符串指针,可通过查找末尾的空字符确定长度。size_is 指定指针参数指向内容的大小。IDL 也可以传递复杂的参数,例如上面的Point3d。

propput和propget将COM函数说明为一个属性,C++会自动加上get_和put_前缀

library 代表要生成一个类型库

interface 指定接口名称,该名称被用在coclass部分里来指定组件支持的接口

coclass 描述由某一给定的COM对象所支持的接口,而GUID指定了组件本身

default 指定了默认的接口,一个组件对象可以拥有至多两个默认接口,一个是针对源,另一个是针对可编程宿接口。




MIDL编译器对IDL文件进行语法分析并为组件生成以下三部分文件

生成C++头文件,声明并定义接口、类标识符和工程接口标识符。ProjectName.h   ProjectName_i.c

编译生成类型库,用户可以通过检查该类型库(.tlb)来确定他们应该如何访问该库,并与之交互

生成一系列c文件和一个make文件,根据他们创建代理/占位dll文件(DLLDate.c,ProjectName_p.c,ProjectNamePS.MK)

0 0
原创粉丝点击