IDispatch的作用主要是什么?

mhuang 2000-03-28 01:51:00
加精
RT
...全文
1373 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
scratch2000 2001-07-26
  • 打赏
  • 举报
回复
我的理解是:IDispatch接口又称为分发接口,任何从该接口派生的接口,可以利用IDispatch的成员函数来实现:1、ID绑定,即假设你知道你的接口方法的绑定号(dispID),则可以直接调用从IDispatch接口继承的函数Invoke(dispID,...)来调用你的方法。注意,此时你的接口的许多方法间接通过Invoke函数来分发实现,而在你的接口中,则不用实现该函数声明及实现。
2、迟绑定,假定你连方法的dispID都不知道,此时可以通过方法名来调用方法,过程如下,实现调用从IDispatch接口继承的函数GetIDsOfName(...)来查询特定方法名对应的dispID值,接着调用Invoke函数来调用该方法即可。
与风分发接口对应的是VTable接口,即前绑定,在编译时刻就根据接口的Vtbale地址实现绑定,虽然这样效率比其他绑定方式要高,但缺乏灵活性,尤其在Vb、vbscrip以及java这样的语言环境中,由于数据类型的差异,很难调用前绑定方式实现的组件接口。
askqiao 2000-11-01
  • 打赏
  • 举报
回复
Automation was built based on COM. A automation server is a COM component with IDispatch in fact, and A automation controler is a COM Client communated to automation server by IDispath. In a word, IDispatch will accept a name of function and execute it.

GetIDsOfNames & Invoke are the most interest function of IDispatch. GetIDsOfNames will read a name of function and return it's DISPID.then Automation will transfer the DISPID to Invoke. Invoke regard DISPID as the index of function ptr array and loop the function to execute it.

See the defination by IDL(Microsoft):
interface IDispatch : IUnknown
{
......

HRESULT GetIDsOfNames(
[in] const IID& riid,
[in, size_is(cNames)] LPOLESTR* rgszNames,
[in] UINT cNames,
[in] LCID lcid,
[out, size_is(cNames)] DISPID* rgDispd);

HRESULT Invoke(
[in] DISPID dispIdMember,
[in] const IID& riid,
[in] LCID lcid,
[in] WORD wFlags,
[in,out] DISPPARAMS* pDispParams,
[out] VARIANT* pVarResult,
[out] EXCEPINFO* pExcepInfo,
[out] UINT* puArgErr);
......
}
softdoctor 2000-03-28
  • 打赏
  • 举报
回复
支持自动化。
用户只要有COM库,不需要任何说明,
边可知道该库所有对象及对象的方法
属性,及方法、属性的参数、返回值
类型,及其ID。
利用IDispatch,用户不需要获得COM
组件的方法实际指针。因为IDispatch::Invoke
提供了一切方法。这就是为什么叫做
dispatch(分发)接口的原因。
如果没有IDispatch开发者必须提供
该COM虚类的原形。
现在的大多数公用COM都被设计为支持
IDispatch接口
Marksman 2000-03-28
  • 打赏
  • 举报
回复
只有实现IDispatch的接口组件才能够被脚本语言这种需要迟绑定使用COM组件使用,
因为脚本语言和VB某种情况下是解释的方式使用组件的,称为迟绑定。
而向VC这些语言使用COM组件时,对组件的调用方式是在编译期间决定的,称为早绑定。
不管怎么样,反正各种开发COM组件的环境都支持直接实现Idispatch而不需要你做一点
多余的工作,何乐而不为呢?
Un1 2000-03-28
  • 打赏
  • 举报
回复
对后期绑定提供统一的访问接口,比如查询名称通过GetIDsOfNames, 调用接口通过Invoke等等。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧