接口定义语言(IDL)简介

 

接口定义语言(IDL)简介

1.ATL不为实现类创建虚函数表,因此初始化成员放在一个公共的函数中(啥意思?!).
2.IDL(
接口定义语言
)
3.IDL
文件由MIDL编译器编译。
4.IDL基础:
接口定义语言是一种方法,通过这种方法,可以定义COM对象所支持的接口。

一个COM对象的IDL文件主要包括两个主要的元素:接口声明和类型库声明。
5.接口
接口是COM组件的一个关键部分,由关键字interface定义。

接口的属性包括:object,   uuid(),    helpstring(),     pointer_default()


<1>object
object
属性是指定接口是COM接口的方法。没有object属性,接口被认为是DCE

 RPC(分布式计算环境远程过程调用

)微软因此增加了object属性,作为为了支持COM。所有你定义的COM接口将有object标志。即所有的COM接口必须

要有object属性。


<2>uuid
这指定了接口的GUID,使接口被唯一的标示。

<3>helpstring
最大长度255字节


<4>pointer_default
服务器程序可以在不同的地址空间或不同的机器上运行。这防止客户端程序直接访问服务器程序的内存,反之亦

然。因此,当传递指针参数时,指针的地址需要被转换到服务器程序的地址空间中去。pointer_default属性表明

这种转换如何发生,对于指针什么样的值是允许的。当指定参数为一个指针是,几个含糊不清的地方需要解决,

以确定指针该如何处理。pointer_default()属性指定了默认怎样处理在接口中所有方法的参数。因此除非在参

数中显式的指定,pointer_default()值将被应用于这个接口所有方法和属性中所有的指针参数。

pointer_default()可能的值为ref,unique,ptr。默认为unique

     ref(引用)属性指定NULL不是一个有效的指针和指针必须是一个有效的值。而且指针值是一个常量;指针必须不能改变成内存中的另一个位置,最后你不能改变指针引用的那块分配内存结构的大小。

    unique允许空指针,并且它可以从空转到非空,反之依然。这样由于可能为空,就不能用于指定结构的大小,如数组。

    ptr属性页被作为完全指针引用(full

 pointer),这是闲置最小的指针选项。


<5>接口声明:(类似于C++
指令_declspec(uuid(x)),这条指令将使接口被打上GUID的烙印,所以,后来如果你指定_uuidof(interface),与接口相关联的GUID将自动被返回。这样很容易访问GUID

例如
声明_declspec(uuid())

struct _declspec(uuid("C552B896-F10C-480A-871D-0FD926D1C872" http://www.blogcn.com/images/wink.gif)
Istopwatch : public IUnknown
{
...
}
以后无论那里使用uuidof(IStopwatch)即可,例如
hr = 

CoCreateInstance(_uuidof(TIMERSlib::Stopwatch,NULL,CLSCTX_INPROC_SERVER,_uuifof(IStopwatch),void**&

pStopwatch));
将返回与接口相关联的GUID
_declspec(novtable)是微软专用的,用作防止创建虚函数表的优化。

6.方法:
COM方法的一般形式为:[attributes]HRESULT name(param_list)


7.参
主要分析3个参数in,out,retval。这三个参数中in,out是最重要的,这些属性表示了参数传递数据的方向。

retval属性是一种方便的将数据返回给客户端程序的方法。
<1>inin属性说明了参数是从客户端传递给服务器程序。
<2>out,out属性表明参数京被返回给客户端程序。但是没有任何信息将从客户端程序传递给服务器程序,因此。服务器程序不能期望标有这种属性的参数包含任何有效的信息,相反,应该把它看成是未初始化的变量。
注意:in和out可以同时使用。
<3>retval,out参数经常与retval属性一起使用,表明这是一个函数的返回值。
注意:每个函数仅可以有一个返回值,因此每个方法只能有一个retval。

而且,IDL语法要求:如果一个函数有多个参数,retval参数(如果有的话)必须总是所有参数的最后一个参数。

8.属性(略)
属性是存储在对象中得值,属性是通过存取函数访问的。
属性所特有的3IDL标志:
propget,propput,proprofref.
<1>porpget
:指定了一个读取函数,存取函数必须有一个返回值,某个参数必须设值为
out
<2>porpput
:设置参数,不许有in属性
<3>proproref

http://www.blogcn.com/images/tongue.giforpputproproref的区别在于:后者传递是指针或引用,而不是值。
9.定义类型库(略)
一旦定义了所有的接口,就是定义类型库和属于这个类型库的组件类的时候了。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值