《COM技术内幕》FAQ
2006-07-21 11:45:54 来源:WEB开发网读书问题之四: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模版)。
分发接口是一个逻辑概念,它是指有个地方存放了函数方法名和函数的指针,通过这个接口,你可以用指定的方法名来检索到函数的指针,最大的用处,是提供给脚本解释器使用。
- ››COM 组件多层聚合嵌套原理
- ››技术分享:post
- ››技术持续创新支撑视频互动领域稳定前行
- ››技术人员求职必看之Javascript词法作用域
- ››技术行业求职路上 不断学习才能更好工作
- ››技术优势显著,EastFax电子传真引CIO强烈关注
- ››COM对象与连接点机制及其MFC程序实现
- ››comScore 统计显示 Android 市场份额继续高歌猛进...
- ››ComScore:谷歌 Android 美国市场份额增至9%
- ››技术回顾:Android 怎么样堆砌安全防线的?
- ››COM中获取JavaScript数组大小
- ››Comet:基于 HTTP 长连接的“服务器推”技术
更多精彩
赞助商链接