学习编写测试桩之动态库篇

来源:互联网 发布:安卓源码下载 编辑:程序博客网 时间:2024/04/24 17:08

我们公司的产品版本多,大产品下又需要挂载很多小产品,并且还要和别的公司的不通功能的产品相互交互、通信;

这样在测试的时候(不管是功能测试、性能测试、安装测试、还是配置测试、部署方案测试)都会遇到很多尴尬的情况,所以我想做个测试装来实现测试,而这个测试装就需要动态库来实现我所需要的。

先来介绍下动态库:

 DLL:Dynamic Linkable Library可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。通常动态库以.dll,.drv、.fon等作为后缀。相应的windows静态库通常以.lib结尾,Windows自己就将一些主要的系统功能以动态库模块的形式实现。

其实已我目前的水平我还是不能理解DLL是如何做到windows资源共享、节省内存空间的。毕竟我还是开发的门外汉呀~~~

简单讲,对于开发来说DLL有个优点:大的程序由很多模块组成,这些模快又对应着不同的功能,如果将所有模块的源代码都静态编译到.exe中,那么整个应用程序将会是很大的,占用很大的磁盘空间,而程序运行的时候也要消耗很到的内存空间;另一方面,大的exe程序,每次改动时都需要再编译所有的源代码,增加了复杂度。所以windows系统平台上就提供了一种不同的编程和运行环境:将独立的程序模块创建为较小的DLL文件,并可以对他们单独编译和测试,在运行时,只有当需要他们时才会被加载到内存空间中,并且这些DLL模块还可以同时被多个应用程序所使用。当然,他是如何做到可以供多个应用程序同时使用,我很困惑。

动态库只有在运行时被加载到进程的虚拟空间中,使用从调用进程的虚拟地址空间非配内存,成为调用进程的一部分。DLL只能被进程的线程访问、DLL句柄可以被调用进程使用、调用进程的句柄可以摆DLL使用、DLL可以有自己的数据段但是没有自己的堆栈、一个DLL在内存中只有一个实例;

动态连接的分类:

1 非MFC动态库:不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。

2 MFC规则动态库:继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C++类或者C++成员函数(注意不要把术语C++类与MFC的微软基础C++类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,常规DLL又可细分成静态链接到MFC和动态链接到MFC两种:
(1)静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。该类DLL里的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。输出函数有如下形式:
      extern "C" EXPORT YourExportedFunction( );
  如果没有extern "C"修饰,输出函数仅仅能从C++代码中调用。
(2)动态链接到MFC的常规DLL里的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。所有从DLL输出的函数应该以如下语句开始:
       AFX_MANAGE_STATE(AfxGetStaticModuleState( ))。      此语句用来正确地切换MFC模块状态。

3 MFC扩展DLL: 这种动态链接库是使用MFC的动态链接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。例如你已经创建了一个从MFC的CtoolBar类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个MFC扩展的DLL中。扩展DLL 和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,所以,开发人员必须在DLL中的DllMain函数添加初始化代码和结束代码。与常规DLL相比,扩展的DLL有如下不同点:

  1) 它没有一个从CWinApp派生的对象;

  2) 它必须有一个DLLMain函数;

  3) DLLMain调用AfxInitExtensionModule函数,必须检查该函数的返回值,如果返回0,DLLMmain也返回0;

  4) 如果它希望输出CRuntimeClass类型的对象或者资源(Resources),则需要提供一个初始化函数来创建一个CDynLinkLibrary对象。并且,有必要把初始化函数输出;

  5) 使用扩展DLL的MFC应用程序必须有一个从CWinApp派生的类,而且,一般在InitInstance里调用扩展DLL的初始化函数。

原创粉丝点击