Welcome

首页 / 软件开发 / C++ / 关于IDispatch接口的LPDispatch属性的实现

关于IDispatch接口的LPDispatch属性的实现2010-11-29杨老师好象是绕口令一样的标题。呵呵,看看下面的这个例子,我想大家就知道是 什么意思了吧。

在脚本语言中,我们经常看到类似这样的语句:obj.Document.Write(...), obj显然是一个自动化的对象(IDispatch),它可以拥有方法和属性。但 Document 到底是什么那?如果说它是方法,那么就无法解释 Document.Write 了;如果说 他是属性,那么属性怎么还有Write方法那?答案是Document是一个LPDispatch 类型的属性(具有自动化类型的属性),当然,这样的属性拥有方法就不奇怪了 吧。

在我们自己写的自动化组件中,当然你可以把所有的方法都用唯一的一个自 动化接口表现出来,但是这样好吗?所有的方法都处于一个层次上,没有适当的 分类,显然不是个优秀的组件。好了,下面看看我们如何实现分层次的自动化组 件吧。

MFC(CCmdTarget) 和 ATL(DUAL 双接口)都可以实现组件自动化的接口。下面 分别来实现。(VC6编译测试通过)

一、用MFC实现LPDispatch自动化接口属性

产生一个支持自动化(Automation)的程序(例子程序中,使用的是DLL)

添加一个自动化类 CAAA ,派生于CCmdTarget。选择Createable by type ID 。注意,只有选择这项,才能被外部程序(VB)CreateObject或(VC) CreateDispatch等方法建立对象

添加另一个自动化类CBBB,派生于CCmdTarget。选择Automation

在CAAA中,添加的成员对象,CBBB m_bbb

在IAAA中,添加名称为BBB,类型为LPDispatch的属性,使用Get/Set类型

完成BBB属性的Get/Set代码 LPDISPATCH CAAA::GetBBB()
{
return m_bbb.GetIDispatch(TRUE);
}
void CAAA::SetBBB(LPDISPATCH newValue)
{
SetNotSupported();
}

在IBBB中,添加方法(例子程序中,实现了一个数值加法)

修改CBBB的析构函数,从protected移动到public中