WEB开发网
开发学院软件开发VC 《COM技术内幕》FAQ 阅读

《COM技术内幕》FAQ

 2006-07-21 11:45:54 来源:WEB开发网   
核心提示: 读书问题之四:P208页,关于对point_default关键字的解释,《COM技术内幕》FAQ(2),看不懂:1、“point_default关键字的作用就是告诉MIDL编译器在没有为指针指定其它属性时应如何处理此指针”“其它属性”都是些什

读书问题之四:P208页,关于对point_default关键字的解释,看不懂:

1、“point_default关键字的作用就是告诉MIDL编译器在没有为指针指定其它属性时应如何处理此指针”“其它属性”都是些什么?

2、“在函数内部,不能为它们指定别名......”,什么是别名?

答:至于别名,是指MIDL语言中的typedef吧(非常抱歉,我对COM的调度部分没有太多的关注,只能简单回答,请你有了明确的答案后告诉我)。 

读书问题之五:P234最后一句,“当然用COM接口来实现IDispatch::Invoke也是可能的,请参阅图11-2”

1、用COM接口如何实现Invoke?

2、图11-2中FooBar不是COM接口吧(没有IUnknown那三个函数)?

答:COM是更好的C++,COM的实现其实借鉴了很多C++的实现方式,比如,利用我前面所说的vtbl,

按照规定,我觉得我们不应该把图11-2的FooBar称为COM接口,但是,在广义的范围内,由于使用了vtbl,可以勉强认为他也是一个COM接口,(如果作者非要这样讲的话 ^_^)

读书问题之六:分发接口是COM接口(符合COM接口的定义吗)?它跟Invoke函数有何关系?如果不是COM接口,那么分发接口的定义是什么?

答:分发接口可以是COM接口,也可以不是,这只是实现时的不同方式而已,分发接口是一个概念,内部应该包含两个数组,一个存放dispid与接口方法名称的对值(pair),一个存放的是dispid与接口方法指针(也就是函数指针)的对值。只要有这两部分我们就认为它是一个分发接口,至于是不是COM接口,那都无所谓。

Invoke的时候,需要提供dispid和对应的参数,这样,就可以利用分发接口的具体实现机制得到函数指针进行功能调用了。

读书问题之七: P234第七行:“IDispatch::Invoke的一个实现所实现的函数集被称作一个分发接口,和dispinterface......”Invoke是一个函数,怎么能够实现“函数集”?Invoke函数跟分发接口之间是什么关系?

答:对于IDispatch::Invoke,我们可以看一下它的运行过程:

在调用Invoke之前,我们通过各种方式得到了一个dispid,(不要以为只有GetIDsOfNames才能得到,我曾经在一个组件里实现了根据状态不同,将可执行的dispid动态传出,然后在组件内提供了一个方法,ExecuteCmd(dispid),这样客户程序也可以动态执行组件的接口方法了)。接口的本质就是一组函数指针的数组,而dispid就是函数指针数组的索引(注意,只有实现IDispatch接口才有dispid),通过指定索引,我们可以得到指定的函数指针,这样我们可以用(*函数指针)(参数,参数…)的方式来调用具体的接口方法了。

“等等......”我听见你在喊,“我们的参数是以数组的形式传进来的,而你用函数指针调用的时候是用参数列表的形式调用的,我要怎样才能实现它呢?”

是的,如果要你自己写一个Invoke的实现,光参数的压栈和类型处理就会累死你的,告诉你一个好办法,用MS的API函数(DispCallFunc 或者 DispInvoke),或者用使用MFC/ATL对IDispatch实现的封装()(MFC用的是一个helper,而ATL用的是IDispatchImpl模版)。

分发接口是一个逻辑概念,它是指有个地方存放了函数方法名和函数的指针,通过这个接口,你可以用指定的方法名来检索到函数的指针,最大的用处,是提供给脚本解释器使用。

上一页  1 2 

Tags:COM 技术 内幕

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接