设为首页 加入收藏

TOP

ATL简介(六)
2012-11-04 15:22:13 来源: 作者: 【 】 浏览:1058
Tags:ATL 简介
  3. 加入接口定义,实现接口函数

  加入了ATL类定义之后,我们可以打开Visual C++(www.cppentry.com)集成环境下项目管理器(Workspace)中的Class View来检查生成的类定义的情况(见图6)。我们可以看到一个新的类已经生成,同时,还生成了相应的接口定义。ATL Object Wizard为我们生成了类定义的.h 和.cpp文件,此外还有用于接口定义的IDL文件。有了这些文件以后,我们就可以为接口加入成员函数,完成类的定义。


图6 ATL工程的ClassView示意图

  首先在Class View中选中相应的接口,图6中显示为接口IATLTest,单击鼠标右键打开菜单,如图7。此弹出式菜单定义了为接口加入属性和方法的操作。选取其中的“Add Method...”项,可以为接口加入方法成员;选取“Add Property...”则可以为接口加入新的属性成员。


图7 接口编辑菜单示意图

  加入属性和方法的对话框可以参看图8和图9。如果我们要在接口中加入一个方法,则选取“Add Method...”菜单命令。假设方法名为ABC,方法的返回类型为COM规定的HRESULT类型。我们也可以定义非HRESULT返回类型的函数,但是这需要手工修改接口定义的IDL文件。我们定义ABC方法的一个参数为a,类型为整数型。完成了方法的定义以后,单击“OK”按钮则把此方法加入到接口中。

  属性的加入过程是类似的。属性加入对话框要求指定属性的类型、名字以及属性的访问方式。在属性和方法的编辑对话框中都有一个“Attributes”按钮,在给出了一个属性或方法的基本定义之后,单击此按钮,可以对属性和方法的一些高级特性进行设置。


图8 加入接口方法的界面


图9 加入接口属性的界面

  方法成员加入以后,我们可以通过Class View来检查ATL为我们所做的工作,如图10所示。首先我们看到ATL在接口的定义中加入了该方法的定义;同时在对应的ATL类定义中,也加入了一个相应的方法的定义;在类对应的.cpp文件中,加入了此方法的实现框架。此后,我们只要在这个函数框架中加入该方法的代码逻辑,一个接口函数的定义和实现就基本完成了。依照这种方式,我们可以完成整个COM对象的定义和实现。


图10 加入接口方法以后的Class View

  完成以上的步骤之后,我们就可以编译连接应用了。

  4. 编译连接应用、注册COM服务程序

  对ATL工程的编译连接过程包括下面的几个步骤:

  使用MIDL编译工程的IDL文件,形成接口定义的头文件和用于调度(Marshalling)的代码;

  编译工程的.cpp文件形成目标文件;

  连接目标文件,形成应用模块;

  注册COM服务程序。

  关于工程编译连接的其它部分同Visual C++(www.cppentry.com)中MFC工程的编译连接过程相似,这里只重点介绍一下COM服务程序的注册过程。

  在ATL中,COM服务程序的注册是在工程编译连接的最后阶段,由ATL辅助完成的。在手工的COM编程(www.cppentry.com)中,服务程序的注册是比较麻烦的工作。在ATL中,系统通过读取在建立工程过程中形成的注册脚本文件来完成注册工作。注册脚本(Register Script 简称RGS)是ATL提供的文本方式的注册辅助文件。下面是注册脚本文件的一个实例。

  HKCR - 表示注册表中COM对象的注册项,是HKEY_CLASS_ROOT的缩写

{

AuthTest.ActiveXObject.1 = s 'ActiveXObject Class'

{

CLSID = s '{97A5CB10-AF82-11D2-B9BC-00104B04B867}'

} - 对象的ProgID

AuthTest.ActiveXObject = s 'ActiveXObject Class'

{

CLSID = s '{97A5CB10-AF82-11D2-B9BC-00104B04B867}'

} -对象的与版本无关的ProgID

NoRemove CLSID -对象CLSID注册项

{

ForceRemove {97A5CB10-AF82-11D2-B9BC-00104B04B867} = s 'ActiveXObject Class'

{

ProgID = s 'AuthTest.ActiveXObject.1'

VersionIndependentProgID = s 'AuthTest.ActiveXObject'

InprocServer32 = s '%MODULE% -服务器类型,表示DLL服务器

{

val ThreadingModel = s 'both' -线程模型,这里是BOTH型

}

}

}

}

  RGS文件包含注册COM服务程序的各项内容,通常我们不必修改此RGS文件,必要时我们也可以手工修改RGS文件来定制模块的注册过程。

首页 上一页 3 4 5 6 下一页 尾页 6/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇共享内存实现进程间大数据的交换 下一篇COM编程技术基础之二

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: