IDispatch是用来做什么的?有什么用呢?
解决方案 »
- 为什么求助!CListCtrl列表框中的项第一次显示不出来,第二次以后就正常了呢?
- VC如何实现DLL释放加载?
- Win32 API中如何从缓冲区把已写入的数据还原
- 用vs2008建立一个控制台工程,当前编译模式是debug还是release,这个信息怎样获得?
- 大侠请进,多文档问题
- 如何在MPEG-1/-2的系统流中提取出视频流?
- 请教一个很简单的问题,我在串口或网口上插了一个设备,windows如何马上检测出来,并正确显示设备名称?
- Access问题!
- vc怎样取消改动提示?
- 如何修改CListCtrl列表框中某一行的字体颜色?
- 如何在一个全局函数中取得当前视图的句柄???
- 我的dvd光驱现在无法识别dvd碟片,但能正常读取cd-rom.这种问题能修好吗?
我们已经讲解过IDispatch的作用了,它的好处就是脚本语言象VBScript、 JavaScript也能用COM组件了,从而基本上做到了与语言无关它的缺点主要有两个,
第一个就是速度慢效率低。这是显而易见的,通过虚函数表一下子就可以调用函数了,而通过Invoke则等于中间转了道手续,尤其是需要把函数参数转换成一种规范的格式才去调用函数,耽误了很多时间。所以一般若非是迫不得已我们都想用VTable的方式调用函数以获得高效率。第二个缺点就是只能使用规定好的所谓的自动化数据类型。如果不用IDispatch我们可以想用什么数据类型就用什么类型,VC会自动给我们生成相应的调度代码。而用自动化接口就不行了,因为Invoke的实现代码是VC事先写好的,而它不能事先预料到我们要用到的所有类型,它只能根据一些常用的数据类型来写它的处理代码,而且它也要考虑不同语言之间的数据类型转换问题。所以VC自动化接口生成的调度代码只适用于它所规定好的那些数据类型,当然这些数据类型已经足够丰富了,但不能满足自定义数据结构的要求。你也可以自己写调度代码来处理你的自定义数据结构,但这并不是一件容易的事。考虑到IDispatch的种种缺点(它还有一个缺点,就是使用麻烦,:-) )现在一般都推荐写双接口组件,称为dual接口,实际上就是从IDispatch继承的接口。我们知道任何接口都必须从 IUnknown继承,IDispatch接口也不例外。那从IDispatch继承的接口实际上就等于有两个基类,一个是IUnknown,一个是IDispatch,所以它可以以两种方式来调用组件,可以通过 IUnknown用虚函数表的方式调用接口方法,也可以通过IDispatch::Invoke自动化调度来调用。这就有了很大的灵活性,这个组件既可以用于C++的环境也可以用于脚本语言中,同时满足了各方面的需要。