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到注册表中搜索,可以搜索到如下结果:
发布评论