用户数据文件自定义访问控制工具研究
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
动态链接库(DLL)
1.动态链接库的基本概念
动态链接库DLL(Dynamic Link Library)是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源,其连接方式是动态的。DLL是一种磁盘文件,它由全局数据,服务函数和资源组成。
Windows操作系统本身就由许多DLL组成,对于Windows应用程序开发者而言,其中最重要的3个DLL是Kernal32.dll(用于管理内存,进程和线程),GDI32.dll(用于画图和显示文本)和User32.dll(用于处理用户接口)。Win32应用程序接口(API)也是由DLL实现的。 copyright think58
2.使用动态链接库的优点
开发者应根据系统功能的需要设计相应的DLL,清楚DLL的优点可以作为选择DLL的一个标准,其优点主要有:
(1) 节省内存空间。一个DLL在内存中只存在一个实例,即只存在一段可执行代码,多个应用程序可以同时共享这段代码。不需要代码的时候可以卸载DLL直到需要的时候再加载。所有Windows应用程序都要用到的Windows API函数大部分就是放在kernel.dll, user.dll, 和gdi32.dll这三个动态链接库中,Windows运行时这3个DLL文件被载入内存供所有应用程序使用,这样极大地节约了内存以及应用程序本身的大小。
(2) 封装共享资源和代码。DLL中可以包含字符串,位图等Windows资源,多个应用程序可以通过DLL共享这些资源。
(3) 接口通用。只要遵守DLL的接口规范,DLL可以被众多编程语言使用。比如界面由VB实现,而核心逻辑由VC编写的DLL实现。
(4) 定制和升级系统。选择不同的DLL可以实现不同的系统,当核心逻辑改变后,只需替换相应的DLL,而系统不用重新编译。
(5) 硬件访问功能。有些高级语言硬件访问功能较弱(如VB),通过DLL不仅可以方便的读取内存,寄存器,端口等,还能保持硬件访问的独立性,减少异常,降低系统崩溃的可能[2]。 内容来自think58 [资料来源:THINK58.com]
3.DLL内部原理分析
DLL是包含资源,数据和函数的模块,虽然它包含可执行代码,但是它只能被EXE或者其它DLL调用,而不能独立运行。正如控制台程序的入口点为Main(),Windows应用程序的入口点为WinMain(),驱动程序的入口点为DriverEntry()一样,DLL的入口点为DLLMain()。当被调用时,可执行代码被动态加载到内存中,并被映射到调用进程的地址空间中。DLL中的数据和函数分为内部的和外部的。内部数据和函数只能在所在DLL中使用,而外部数据和函数可以被其它模块使用。DLL文件包括一张导出表,其中记录了DLL向外部输出的数据和函数,外部调用模块正式通过这张表完成对DLL中的数据和函数的访问[5]。
4.动态链接库的组成
(1) 动态链接库的入口函数
无论是编写Win32 Dynamic--Link Library的动态链接库,还是编写MFC AppWizard(dl1)的动态链接库,都必须有一个DLL的入口函数,其函数原型为:
BOOL APIENTRY DllMain ( HANDLE hModule,
DWORD ul_reason_for_call,LPVOID lpReserved)
{ //可编写DLL的相关初始化代码
return TRUE;}
在这个函数中,第一个参数hModule是指向DLL本身的句柄;第二个参数
ul_reason_for_call 常被用来指明DLL调用的原因;第三个参数lpRe_served是系统保留的参数。
[来源:http://www.think58.com]
如果程序员没有为 DLL模块编写一个 DLLMain函数,系统会从其他运行库中引入一个不做任何操作的缺省DLLMain函数版本,但并不意味着DLL可以放弃DllMain函数。在单个线程启动和终止时,DLLMain数也被调用[4]。
(2) 导出函数和内部函数
一般情况下DLL主要是为外部应用程序提供可调用的函数,因此在DLL中必须定义一些函数。DLL中定义的函数如果是外部应用程序可调用的函数,那么这种函数叫做导出函数(Export Function)。相反,如果只为在DLL内部调用的函数叫做内部函数(Internal Function),比如DllMain函数。其中导出函数在客户端叫做导入函数。
DLL文件中包含一个导出函数表。这些导出函数由他们的符号名和称为标识号的整数与外界联系起来。函数表中还包含了DLL中函数的地址。当应用程序加载DLL 模块时,它并不知道调用函数的实际地址,但它知道函数的符号名和标识号。动态链接过程在加载的DLL模块时,动态建立一个函数调用与函数地址的对应表。如果重新编译和重建DLL文件,并不需要修改应用程序,除非改变了导出函数的符号名和参数序列。
导出函数在DLL定义时须以某种特定的方式声明,有两种声明方式:一种是在定义函数时使用导出关键字declspec(rjllexport);另一种是采用模块定义文件(.def)。简单的DLL文件只为应用程序提供导出函数,比较复杂的DLL文件除了提供导出函数以外,还调用其他DLL文件中的函数。这样,一个特殊的DLL可以既有导出函数,又有导入函数。这并不是一个问题,因为动态链接过程可以处理交叉相关的情况。在DLL代码中,必须像下面这样明确声明导出函数: [来源:http://www.think58.com]
_declspec(dllexport)int MyFunction(int n);
但也可以在模块定义(DEF)文件中列出导出函数,不过这样做常常引起更多的麻烦。在应用程序方面,要求像下面这样明确声明相应的导入函数:
_declspec(dllimport)int MyFunciti0n(int n)I
仅有导入和导出声明并不能使应用程序内部的函数调用链接到相应的DLL文件上。应用程序的项目必须为链接程序指定所需的输入库(LIB文件)。而且应用程序事实上必须至少包含一个对DLL函数的调用。
think58.com
[资料来源:http://think58.com]
5.动态链接库的创建
Visual C++支持三种DLL,即Non_MFC DLL(非MFC动态库 )、MFC Regular
DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL包含一个继承自CWinApp的类,但无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,只能被用MFC类库所编写的应用程序所调用。本文主要介绍非MFC DLL。
非 MFC DLL中不能包含 MFC,如果 DLL中不需使用 MFC,则创建这种类型的DLL可以节省链接到 MFC所需的磁盘和内存空间。这种类型的DLL在工程中应用得最为广泛,它常常包含各种算法的实现、共享常量和变量等[7]。
首先创建工程,选择工程类型为“Win32 Dynamic—Link Library”。接着选择工程的属性:“An empty DLL project”不创建任何文件,开发者可以将已经存在的*.cpp,*.h,*def等文件引入工程;“A simple DLL project”仅包含空的入口函数 DllMain。但没导出和导入宏定义;“A DLL that exports some symbols”包含简单的入口函数DllMain,导出和导入宏定义,还包含导出变量、导出函数和导出类的模型。
think58.com
上一篇:C# 酒店客房管理系统毕业论文
下一篇:四国军棋系统