1、custom interface:
<1>接口继承:该类型的接口继承IUnknown接口,它不继承IDispatch接口 ;
<2>调用方式:它只支持通过虚表的方式来调用COM对象中的方法;
2、dual interface:
<1>接口继承:该类型的接口继承IUnknown接口,同时也继承IDispatch接口 ;
<2>调用方式:它支持通过虚表的方式来调用COM对象中的方法;同时也支持通过函数ID的方式来调用COM对象中的方法 ;
3、dispinterface(dispatch interface):
<1>接口继承:该类型的接口继承IUnknown接口,它也继承IDispatch接口 ;
<2>调用方式:它只支持通过函数ID的方式来调用COM对象中的方法,它不支持通过虚表的调用方式;(?)
首先IDispatch是继承于IUnknown的。
dispinterface是一个纯的IDispatch实现,一个dispinterface对象对外界暴露的只是一个IDisaptch接口,你只能调用IDisatpch的方法;而双接口出来暴露IDispatch接口外还会保留一个自定义接口。
例如:
interface IA : public IUnknown
{
virtual HRESULT __stdcall test() = 0;
}
class A : public IA, pulic IDispatch
{
pbublic:
HRESULT __stdcall test(){}
};
这个对象可以理解为是一个双接口,你可以通过QueryInterface的方法获取到IA,然后通过IA接口指针来调用test方法,你也可以通过获取到IDispatch,然后通过IDispatch::GetIDsOfNames获取的test方法的dispid,然后通过IDispatch::Invoke传入调用test方法。
而对于dispinterface接口来说,对于外部只能看到IDispatch接口。
class A : pulic IDispatch
{
pbublic:
HRESULT __stdcall test(){}
};
而你只能通过IDispatch::GetIDsOfNames获取的test方法的dispid,然后通过IDispatch::Invoke传入调用test方法。
本文详细介绍了COM接口的三种类型:Custom、Dual和Dispatch。Custom接口只继承IUnknown,通过虚表调用方法。Dual接口同时继承IUnknown和IDispatch,支持虚表和函数ID两种调用方式。Dispinterface仅继承IUnknown和IDispatch,但只允许通过函数ID调用,不支持虚表调用。这些接口类型在COM对象的交互中起到关键作用。
4万+

被折叠的 条评论
为什么被折叠?



