三、用 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” |
|