分享

COM组件设计与应用之VC6的IDispatch接口...

 伤心莫哭 2010-11-08
三、用 MFC 实现自动化组件

      我写的这整个系列文章---《COM 组件设计与应用》,多是用 ATL 写组件程序,但由于自动化非常有用,在后续的文章中,还要给大家介绍组件的“事件”功能,还要介绍如何在 MFC 的程序中象 WORD 一样支持“宏”的功能。这些都要用到 MFC,所以就给读者唠一唠下啦。
   
  3-1:建立一个工作区(Workspace)

      3-2:建立一个 MFC DLL 工程(Project),工程名称为“Simple5”


   
  3-3:一定要选择 automation,切记!切记!


   
  3-4:建立新类


   
  3-5:在新建类中支持automation



  Class information - Name
你随便写个类名子啦

  Class information - Base class 一定要从 CComTarget 派生呀,只有它才提供了 IDispatch 的支持

  Automation - None 表示不支持自动化,你要选择了它,那就白干啦

  Automation - Automation 支持自动化,但不能被直接实例化。后面在讲解多个 IDispatch 的时候就用到它了,现在先不要着急。

  Automation - Createable by type ID
一定要选择这个项目,这样我们在后面的调用中,VB就能够CreateObject(),VC就能够CreateDispatch()对组件对象实例化了。注意一点,这个 ID 其实就是组件的 ProgID 啦。

      3-6:启动 ClassWizard,选择 Automation 卡片,准备建立函数 


   
  3-7:添加函数。我们要写一个整数加法函数Add()。


    3-8:再增加一个转换字符串大小写的函数 Upper()。函数返回值是 BSTR,这个没有什么疑问,但参数类型怎么居然是 LPCTSTR?在 COM 中,字符串不是应该使用 BSTR 吗?是的,是应该使用 BSTR,但由于我们是用 MFC 写自动化组件,它帮我们进行 BSTR 和 LPCTSTR 之间的转换了。

   
  3-9:好了,下面开始输入程序代码:
long CDispSimple::Add(long n1, long n2)
{
return n1 + n2;
}
BSTR CDispSimple::Upper(LPCTSTR str)
{
CString strResult(str);
strResult.MakeUpper();
return strResult.AllocSysString();
}
      3-10:编译注册

      如果上面的操作由于疏忽而发生了错误,那么你可以手工进行改正。

  其一、步骤<3-6>的对话窗中有“Delete”操作;

  其二、你可以打开 ODL 文件(注2)进行修改,修改时要特别小心函数的声明中,有一个[id(n)] 的函数序号,可不要乱了;

  其三、同步修改 H/CPP 中的函数声明和函数体;

  其四、在CPP文件中,根据情况也要修改 BEGIN_DISPATCH_MAP/END_DISPATCH_MAP()函数影射宏。

     正确编译后,MFC不象ATL那样会自动注册。你需要手工执行 regsvr32.exe 进行注册,或者执行菜单“Tools\Register control”

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多