2024年5月11日发(作者:)

Dispatch接口原理与应用

目录:

前言:

IDispatch接口的定义:

创建支持IDispatch接口的COM对象:

标准方式调用IDispatch接口的方法:

采用ATL智能指针类调用IDispatch接口的方法:

使用类COleDispatchDriver调用IDispatch的方法:

前言:

尽管com接口是跨语言的,但是很多语言在使用com时更多地通过Automation技术来

和com对象通信。IDispatch接口是Automation的核心技术。

尽管c++程序员并不喜欢甚至讨厌使用 IDispatch接口,因为调用它实在是非常的麻烦

而且易出错。但是不可否认大量的现存组件是只基于IDispatch接口技术而开发的,有时候

你没有 选择,而且如果你想要写一些组件能够在web上运行,你也离不开IDisptch接口,

因为VBScript这样的脚本语言不会聪明到能够理解你的基于虚 函数表的普通com接口。

与其躲避它,不如征服它。本文中,我将结合自己的经验和读者一起探讨IDispatch接

口的各种应用。并介绍几种能够加快我们使用IDispatch接口的c++类。

IDispatch接口的定义:

参照文件oaidl.h中的定义----

MIDL_INTERFACE("00020400-0000-0000-C0046")

IDispatch : public IUnknown

{

public:

virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(

/* [out] */ UINT *pctinfo) = 0;

virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(

/* [in] */ UINT iTInfo,

/* [in] */ LCID lcid,

/* [out] */ ITypeInfo **ppTInfo) = 0;

virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(

/* [in] */ REFIID riid,

/* [size_is][in] */ LPOLESTR *rgszNames,

/* [in] */ UINT cNames,

/* [in] */ LCID lcid,

/* [size_is][out] */ DISPID *rgDispId) = 0;

virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke(

/* [in] */ DISPID dispIdMember,

/* [in] */ REFIID riid,

/* [in] */ LCID lcid,

/* [in] */ WORD wFlags,

/* [out][in] */ DISPPARAMS *pDispParams,

/* [out] */ VARIANT *pVarResult,

/* [out] */ EXCEPINFO *pExcepInfo,

/* [out] */ UINT *puArgErr) = 0;

};

我们通过IDispatch的GUID到注册表中搜索,可以搜索到如下结果: