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方法。