1,自动化组件,其实就是实现了IDispatch接口的组件.IDispatch接口有四个函数,解释语言的执行器通过这仅有的四个函数来执行组件所提供的功能.这四个函数描述如下:

Code
1,HRESULT GetTypeInfoCount([out] UINT * pctinfo);
组件中提供几个类型库,一般都是一个。但如果你在一个组件中实现了多个 IDispatch 接口,那就不一定拉.
2,HRESULT GetTypeInfo(
[in] UINT iTInfo,
[in] LCID lcid,
[out] ITypeInfo ** ppTInfo);
调用者通过该函数取得他想要的类型库。
3,HRESULT GetIDsOfNames(
[in] REFIID riid,
[in,size_is(cNames)] LPOLESTR * rgszNames,
[in] UINT cNames,
[in] LCID lcid,
[out,size_is(cNames)] DISPID * rgDispId);
根据函数名称取得函数序号,为调用 Invoke() 做准备。
4, HRESULT Invoke(
[in] DISPID dispIdMember,
[in] REFIID riid,
[in] LCID lcid,
[in] WORD wFlags,
[in,out] DISPPARAMS * pDispParams,
[out] VARIANT * pVarResult,
[out] EXCEPINFO * pExcepInfo,
[out] UINT * puArgErr) ;
根据序号,执行函数。
2,所谓双接口,其实是在一个 VTAB 的虚函数表中容纳了三个接口(因为任何接口都是从 IUnknown 派生的,所以就不强调 IUnknown 了,叫做双接口)。我们如果从任意一个接口中调用 QueryInterface()得到另外的接口指针的话,其实,得到的指针地址都是同一个。