客户控制组件的另一种方法--------------自动化

来源:互联网 发布:制作个性二维码软件 编辑:程序博客网 时间:2024/05/07 02:38
客户控制组件的另一种方法--------------自动化
自动化使得用解释型语言和宏语言访问COM组件更为容易,同时用这些语言编写组件更为容易。自动化关注的是运行时刻的类型检查,这是以速度的牺牲和编译时刻的类型检查为代价。虽然自动化对于宏语言来说使用更容易,但对于C++开发而言,则需要更多的工作。自动化在许多不同的方面开发人员编写的代码来替换编译器生产的代码。
自动化不独立于com的 ,而是建立在 com基础上的 。自动化服务器程序实际上 就是实现IDispatch接口的COM组件。而自动化控制器则是通过IDispatch接口同自动化服务程序进行通信的com客户。自动化控制器不会直接调用自动化服务程序实现的那些函数,而是通过IDispatch接口中的成员函数实现对服务程序中函数的间接调用。
用了IDispatch之后,COM组件就可以通过一个标准的接口提供它所有支持的服务,而无需提供多个特定于服务的接口。当我们在宏语言中调用COM组件中的一个函数时,我们可以使用三种类型的信息:实现被调用函数的组件的progID,函数名以及传给函数的 参数。我们希望宏的运行时刻系统能够提供一种通过函数的名称来执行函数的简单方法。这里方法就是IDispatch接口所提供的。
1.              IDispatch接收一个函数的名称并执行这个函数。IDispatch中的最令人感兴趣的两个函数是GetIDsOfName和Invoke。GetIDsOfName读取一个函数的名称并返回其分发ID,或称DISPID。DISPID并不是一个GUID,而是一个长的整数,它标识的是一个函数。对于IDispatch的某个特定的实现,DISPID是唯一的。IDispatch的每个实现都有其自己的IID
2.              为了执行某个函数,自动化控制程序把DISPID传给Invoke成员函数。Invoke可以将DISPID作为函数的指针数组的索引,这同常规的COM接口非常相似。但在自动化程序并不需要按这种方式实现Invoke。一个简单的自动化服务程序可以根据DISpatch用一个case语句执行不同的代码。这同MFC广泛流行之前的窗口过程的实现的方法相似。
3.              IDispatch::Invoke在其他许多方面同窗口过程是类似的。将窗口工程同窗口关联起来的方法同将自动化服务程序同IDispatch::invoke函数关联起来的方法相同。Microsoft Windows给窗口过程发送各种各样的消息,而自动化控制程序个IDispatch::invoke传递相应的DISPID。窗口过程的行为由它接收到的消息决定,而 Invoke的行为则是由它接收的DISPID决定的。
 
原创粉丝点击