WEB开发网
开发学院软件开发VC COM组件设计与应用(十八)——属性包 阅读

COM组件设计与应用(十八)——属性包

 2006-07-22 22:55:21 来源:WEB开发网   
核心提示: 三、调用者的实现我们在阅读 MSDN 关于 IPersistPropertyBag 接口函数的时候,你会发现还需要一个接口 IPropertyBag 与之配合才能实现属性包功能,COM组件设计与应用(十八)——属性包(5),而 IPropertyBag 则需要我们在调用者(容器)中来实现该

三、调用者的实现

我们在阅读 MSDN 关于 IPersistPropertyBag 接口函数的时候,你会发现还需要一个接口 IPropertyBag 与之配合才能实现属性包功能。而 IPropertyBag 则需要我们在调用者(容器)中来实现该接口。它们之间的关系如下:

前面几回书中,我们已经学会了从 IUnknown 派生类,也学会了从 IDispatch 派生类,也学会了从 ICallBack 派生类......同样,这回我们要从 IPropertyBag 派生了。在示例程序中,我们添加了一个类 CPropertyBag::public IPropertyBag,同时重载了所有的虚函数。

STDMETHODIMP CPropertyBag::QueryInterface(const struct _GUID &iid,void ** ppv)
{
  *ppv = this;
  return S_OK;
}
ULONG __stdcall CPropertyBag::AddRef(void)
{  return 1;    }  // 做个假的就可以,因为反正这个对象在程序结束前是不会退出的
ULONG __stdcall CPropertyBag::Release(void)
{  return 0;    }  // 做个假的就可以,因为反正这个对象在程序结束前是不会退出的
STDMETHODIMP CPropertyBag::Read(LPCOLESTR pszPropName,VARIANT *pVar,IErrorLog *pErrorLog)
{
  // 根据 pszPropName 指定的属性名称,你要提供该属性的值。
  // 而值的数据类型已经在 pVal->vt 中指定了。
  if( 如果能提供指定的数据 )  return S_OK;
  else  return E_FAIL;
}
STDMETHODIMP CPropertyBag::Write(LPCOLESTR pszPropName,VARIANT *pVar)
{
  // 根据 psaPropName 指定的属性名称和 pVar 提供的值
  // 你保存到文本中去吧。
  return S_OK;
}

以上是调用者(容器)程序的关键部分,其它的管理和协调部分,读者去阅读示例程序代码。编译注册组件,并运行调用者示例程序,显示如下:

在编辑窗口中你可以随便指定 str 和 interger 的值,然后“启动组件”,那么你设定的属性值就会在启动组件的同时,通过 IPersistPropertyBag 接口设置到组件中(还原了持续性的环境)。而后,你就可以在下面的 Property 分组操作中,“设置/读取”组件的属性了。当“关闭组件”的时候,程序通过调用 IPersistPropertyBag 接口函数,又重新取得组件的属性名称和值保存到编辑窗的文本中了。

四、小结

理解了本回属性包接口的功能,你就能体会出 IE 是如何装载 ActiveX (注2)控件并设置控件的状态了。


注1:在 vc.net 中,由于系统已经有 CProperty 类,所以这里我们改换名称为 CMyProperty。

注2:通过十八回的学习,我们已经了解组件的一些常用接口,为我们学习 ActiveX 的组件编程打下了基础。下回书,我们就开始学习 ActiveX。

上一页  1 2 3 4 5 

Tags:COM 组件 设计

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接