首页 理论教育 C++对象DLL集成与重用

C++对象DLL集成与重用

时间:2023-11-16 理论教育 版权反馈
【摘要】:为了能够更好的重用,我们把C++对象(服务者)打包进DLL。对于客户所关心的功能,也就是C++类中的成员函数,要成为DLL的导出函数,这些函数将被客户以显式链接或者隐式链接的方式使用。最后选择Build命令构建程序,在项目文件夹下的debug目录生成引入库文件和动态链接库。程序清单8-5客户文件Client.cpp连接动态链接库。

C++对象DLL集成与重用

以动态链接库的方式发布程序能够隐藏宝贵的实现技术,因为功能的实现都形成了二进制代码,客户要了解和重用服务者,只能通过像说明书一样的头文件。实际上,对于服务者,客户一般也只关心它能够提供哪些功能或服务,因此,DLL就成了自然而然的选择。

为了能够更好的重用,我们把C++对象(服务者)打包进DLL。但这个过程有三件事情需要处理:第一,成员函数的导出。对于客户所关心的功能,也就是C++类中的成员函数,要成为DLL的导出函数,这些函数将被客户以显式链接或者隐式链接的方式使用。第二,内存管理。面向对象方法的一个主要目的,是让对象成为自主的实体,不需要用户参与而增加负担。因而,对象数据所用内存要让对象自己管理即分配和释放。第三,Unicode/ASCII兼容。如果让服务者的功能更为通用,就要考虑DLL的Unicode兼容性问题。在本章中,只作COM核心内容的介绍,所以,在提供的例子程序(例程)中没有作Unicode兼容处理。我们把关注的重点放在前两件事情上面。

本节的例程是在上一节char_set基础上修改。这里要建立两个工程,一个是服务者开发的项目(CHARSET_DLL),另一个是使用服务者的项目,即客户项目(CLIENT)。下面是具体的修改步骤:

1. 创建服务者例程

(1)创建DLL工程框架。使用AppWizard新建一个DLL工程项目,选择项目类型为“Win32Dynamic-Link Library”,名称为CHARSET_DLL。在DLL类型选择中选“An Empty DLL Project”建立一个空的DLL项目。

(2)添加文件。拷贝CHARSET的char_set.h和char_set.cpp文件到CHARSET_DLL目录下,然后添加到项目中。(添加方法:使用菜单命令Project->Add to project->Files…)

(3)修改定义文件。在char_set类中添加成员函数Release,该函数在对象不再被使用时删除自己,另外,又声明了一个类厂类CS_Factory,在类厂中建立对象并返回对象指针。这个类厂也是一个提供服务的类,顾名思义,它的作用就是负责创建服务类的对象。在目前的软件设计模式当中,这种类厂“生产”服务对象的模式非常流行。

定义文件修改后的程序清单如程序清单8-3所示。

程序清单8-3 修改后的定义文件char_set.h

(4)修改实现文件。在实现文件char_set.cpp的尾部把新增加的内容添加进去,其余的代码不要作修改,如程序清单8-4所示。

程序清单8-4 char_set.cpp文件中修改的代码

(www.xing528.com)

(5)构建生成DLL。最后选择Build命令构建程序,在项目文件夹下的debug目录生成引入库文件(CHARSET_DLL.lib)和动态链接库(CHARSET_DLL.dll)。

2. 创建客户例程

(1)建立一个控制台应用程序(Win32 Console Application),程序项目名称为CLIENT。在向导中选择建立空项目,以后再添加文件。

(2)拷贝上面的char_set.h、CHARSET_DLL.lib和CHARSET_DLL.dll三个文件到此项目的目录下,然后在空项目中添加并编辑一个Client.cpp文件,在其中的主函数main中使用DLL中的对象。使用过程是这样的:先调用导出函数DllGetClassFactoryObject获得类厂对象指针,再用该指针创建服务对象并返回服务对象的指针,之后,类厂对象不再使用(要释放),最后就是客户程序通过指针与服务对象打交道了。

编辑后的Client.cpp文件如程序清单8-5所示。

程序清单8-5 客户文件Client.cpp

(3)连接动态链接库。因为不再需要字符集类的实现源代码,所以我们只拷贝了char_set.h文件,没有用到char_set.cpp。但是,这里使用隐式方式连接DLL,必须还要用到导入库文件CHARSET_DLL.lib:打开Project Setting对话框,选择Link设置页,在Object/Library modules项中添加CHARSET_DLL.lib,如图8-2所示。

图8-2 客户程序使用LIB隐式连接DLL

(4)编译和运行客户程序。选择Build命令编译程序,然后运行。程序运行时,字符集设置字符、读取字符和计算长度的操作完全正常。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈