三、用 MFC 实现自动化组件
我写的这整个系列文章---《COM
组件设计与应用》,多是用 ATL 写组件程序,但由于自动化非常有用,在后续的文章中,还要给大家介绍组件的“事件”功能,还要介绍如何在
MFC 的程序中象 WORD 一样支持“宏”的功能。这些都要用到 MFC,所以就给读者唠一唠啦:-) 逆风者
3-1:建立一个解决方案
3-2:建立一个 MFC DLL 项目,项目名称为“Simple7”

3-3:一定要选择附加功能中的“自动化”,切记!切记!

3-4:添加新类

3-5:在新建类中支持自动化

类名 你随便写个类名子啦
基类
一定要从 CComTarget 派生呀,只有它才提供了
IDispatch 的支持
自动化 - 无
表示不支持自动化,你要选择了它,那就白干啦
自动化 -
自动化
支持自动化,但不能被直接实例化。后面在讲解多个 IDispatch
的时候就用到它了,现在先不要着急。
自动化 - 可按类型ID创建
一定要选择这个项目,这样我们在后面的调用中,VB就能够CreateObject(),VC就能够CreateDispatch()对组件对象实例化了。注意一点,这个
ID 其实就是组件的 ProgID 啦。
3-6:选择接口,添加函数

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

3-8:再增加一个转换字符串大小写的函数 Upper()。

3-9:好了,下面开始输入程序代码:
LONG CDispSimple::Add(LONG n1, LONG n2)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return n1 n2;
}
BSTR CDispSimple::Upper(LPCTSTR str)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString strResult(str);
strResult.MakeUpper();
return strResult.AllocSysString();
}
3-10:编译注册
如果上面的操作由于疏忽而发生了错误,那么你可以手工进行改正。
其一、你可以打开 IDL 文件进行修改,修改时要特别小心函数的声明中,有一个[id(n)]
的函数序号,可不要乱了;
其二、同步修改 H/CPP 中的函数声明和函数体;
其三、在CPP文件中,根据情况也要修改 BEGIN_DISPATCH_MAP/END_DISPATCH_MAP()函数影射宏。
正确编译后,vc.net 2003 比
vc6.0 要聪明多了,它会自动注册组件。如果复制到其它计算机上,你也需要手工执行 regsvr32.exe
进行注册。
四、用 ATL 实现双接口组件(操作方法和步骤,请参考《COM
组件设计与应用(六)》)
4-1:建立一个 ATL 项目,项目名称为“Simple8”
4-2:选择 DLL
类型、非属性方式、不要选择任何附加选项
4-3:添加新类,选择ATL 的简单对象
4-4:输入简称和选项,选项按默认进行,也就是双重接口方式(注2)


4-5:增加函数。选择接口、鼠标右键菜单、添加方法...
Add([in] VARIANT v1, [in] VARIANT v2, [out, retval] VARIANT * pVal);
Upper([in] BSTR str, [out,retval] BSTR * pVal);
关于Add()函数,你依然可以使用
Add([in] long n1, [in] long n2, [out,retval] long * pVal)
方式。但这次我们没有使用 long ,而是使用了 VARIANT
做参数和返回值。这里我先卖个关子,往下看,就知道使用 VARIANT 的精彩之处了。 本文章更多内容:<<上一页 - 1 - 2 - 3 - 下一页>> |