IDispatch接口 - Dual和Custom

当用ATL向导来创建一个接口的时候,向导会让我们选择Dual或者Custom.

那么它们到底有什么分别呢?

Dual

鼠标移上去,其实是有个说明的。下面的截图没有显示后面的一些文字,

实际意思是说这个接口同时支持IDispatch方式和vtable方式,这大概也就是双接口(Dual)名字的来源。

vtable调用方式,指的是直接通过接口指针的虚函数表。比如

CComPtr<IMyCar> spCar;
spCar.CoCreateInstance(CLSID_MyCar, NULL, CLSCTX_INPROC_SERVER);
spCar->Run();

上面的代码就是通过虚函数表来找到IMyCar的实现类的Run函数。

而IDispatch调用方式就是前面文章讲过的通过Invoke函数来调用。其实当我们调用IDispatch::Invoke()的时候,IDispatch的实现类会经过一系列的转换,最终调用目标函数。

Custom

Custom没有支持IDispatch,只支持vtable。实际上Custom接口是从IUnknown继承下来的,而Dual接口是从IDispatch继承下来的(IDispatch从IUnknown继承下来)。

如果是custom接口,那么只能通过vtable的方式了,就是通过接口指针来调用成员函数,而不能用IDispatch的invoke了。

那什么时候用Dual,什么时候用Custom呢?

我个人的准则就是:当com组件只在C++里面被调用的时候,用custom;如果com组件可能被其他语言调用,那么就用dual。

另外,通过IDispatch::Invoke(),效率会比vtable调用方式低很多,因为它要经过很多转换。如果是C++调用环境,尽可能使用vtable的方式,如果是其他语言就没办法了,只能是IDispatch方式。

时间: 2024-10-09 10:48:32

IDispatch接口 - Dual和Custom的相关文章

【转载】COM 组件设计与应用(九)——IDispatch 接口 for VC6.0

原文: http://vckbase.com/index.php/wv/1224.html 一.前言 终于写到了第九回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用.非常有用.非常精彩的一个 COM 功能.由于 WORD.EXCEL 等 OFFICE 软件提供了“宏”的功能,就连我们使用的VC开发环境也提供了“宏”功能,更由于 HTML.ASP.JSP 等都要依靠脚本(Script)的支持,更体现出了自动化接口的重要性. 如果你使用 vc6.0 的开发环境,

IDispatch接口介绍

1.         C程序调用时,调用者必须预先知道接口规范(如,参数类型.参数字节长度.参数顺序等).由于不同语言这些规范有所不同,COM未解决不同语言之间调用,提供了IDispatch接口. 2.         IDispatch要求其实例必须自我描述,即拿到一个对象后,可从对象中直接获取调用方式,而无须预先明确. 3.         IDispatch中通过VT_TYPE来指定相关类型,如 VT_I4为4字节整形.VT_BSTR为unicode字符串,VT_DISPATCH表示是一个

IDispatch接口 - GetIDsOfNames和Invoke

IDispatch接口是COM自动化的核心.其实,IDispatch这个接口本身也很简单,只有4个方法: IDispatch : public IUnknown { public: virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( /* [out] */ __RPC__out UINT *pctinfo) = 0; virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( /* [in] */ UINT i

【转载】COM 组件设计与应用(十)——IDispatch 接口 for VC.NET

原文:http://vckbase.com/index.php/wv/1225.html 一.前言 终于写到了第十回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用.非常有用.非常精彩的一个 COM 功能.由于 WORD.EXCEL 等 OFFICE 软件提供了“宏”的功能,就连我们使用的VC开发环境也提供了“宏”功能,更由于 HTML.ASP.JSP 等都要依靠脚本(Script)的支持,更体现出了自动化接口的重要性. 如果你使用 vc6.0 的开发环境,请

IDispatch接口 - 跨语言调用

当一个COM接口支持IDispatch的时候(Dual接口),它就可以被其他语言调用. 这里我用perl试了一下. perl测试代码 use warnings; use strict; use Win32::OLE; use constant ADS_UF_ACCOUNTDISABLE => 2; use constant ADS_SCOPE_SUBTREE => 2; my $MyCom = Win32::OLE->new( "MyCom.MyCar" ) or d

COM三大接口:IUnknown、IClassFactory、IDispatch

COM组件有三个最基本的接口类,分别是IUnknown.IClassFactory.IDispatch. COM规范规定任何组件.任何接口都必须从IUnknown继承,IUnknown包含三个函数,分别是 QueryInterface.AddRef.Release.这三个函数是无比重要的,而且它们的排列顺序也是不可改变的.QueryInterface用于查询组件实现的其它接口,说白了也就是看看这个组件的父类中还有哪些接口类,AddRef用于增加引用计数,Release用于减少引用计数.引用计数也

【转载】COM 组件设计与应用(十一)—— IDispatch 及双接口的调用

原文:http://vckbase.com/index.php/wv/1236.html 一.前言 前段时间,由于工作比较忙,没有能及时地写作.其间收到了很多网友的来信询问和鼓励,在此一并表示感谢.咳......我也需要工作来养家糊口呀...... 上回书介绍了两种方法来写自动化(IDispatch)接口的组件程序,一是用 MFC 方式编写“纯粹”的IDispatch 接口:二是用 ATL 方式编写“双接口”的组件. 二.IDispatch 接口和双接口 使用者要想调用普通的 COM 组件功能,

ATL实现一个组件多个dual接口,multidisp

最近想自己写个按键精灵的插件,于是接触到这个问题: 怎么在一个组件里实现两个自动化接口. 主要针对的ATL,MFC貌似没这个问题,具体MFC是怎么实现的自己没有深究. 按键精灵的插件会在一个组件里实现两个dispinterface,具体请看oleview工具截图: 刚开始对这个问题不理解,以为不是问题,自己用ATL尝试了几次,才发现不是那么回事,于是google之. MSDN上是这么说的,看这里 ATL不提供任何为将多个双重接口支持.IDispatch的单个实现. 但是,有几个已知的方法来手动合

【转载】COM 组件设计与应用(八)——实现多接口

原文:http://vckbase.com/index.php/wv/1219.html 一.前言 从第五回开始到第七回,咱们用 ATL 写了一个简单的 COM 组件,之所以说简单,是因为在组件中,只实现了一个自定义(custom)的接口 IFun.当然如果想偷懒的话,我们可以把 200 个函数都加到这一个接口中, 果真如此的话,恐怕就没有人喜欢使用我们这个组件了.一个组件既然可以提供多个接口,那么我们在设计的时候,就应该按照函数的功能进行分类,把不同功能分类的函数用多个接口表现出来.这样可以有