项目 12 :动态链接库-在 pda 研发中使用 dll 文件( 1 )

Post on 01-Jan-2016

146 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

项目 12 :动态链接库-在 PDA 研发中使用 DLL 文件( 1 ). 本节课程主要知识点 动态链接库 动态链接库的特点 动态链接库的实现. 重点和难点. 重点 动态链接库 难点 动态链接库的编制. 动态链接库. EXE 文件. 比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。 可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。 在构造软件系统时,常常将所有模块的源代码都静态编译到整个应用程序 EXE 文件中。. EXE 文件的软肋. - PowerPoint PPT Presentation

TRANSCRIPT

项目 12:动态链接库-在 PDA研发中使用 DLL文件( 1)

本节课程主要知识点 动态链接库 动态链接库的特点 动态链接库的实现

重点和难点重点 动态链接库

难点 动态链接库的编制

动态链接库

EXE 文件 比较大的应用程序都由很多模块组成,

这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。

可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。

在构造软件系统时,常常将所有模块的源代码都静态编译到整个应用程序 EXE文件中。

EXE 文件的软肋 源代码都静态编译到整个应用程序 EXE

文件中,会产生一些问题。 一是增加了应用程序的大小,占用更多的磁

盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费。

另一个缺点是,在编写大的 EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。

Windows CE 中如何解决问题? Windows CE 中内存资源更少,甚至都没

有硬盘,资源问题更为突出。 Windows 系统平台上提供了一种有效的

编程和运行环境,你可以将独立的程序模块创建为较小的文件,并可对它们单独编译和测试。

这些较小的模块就是动态链接库 DLL 。

Windows CE 中的 DLL

在运行时,只有当 EXE 程序确实要调用这些 DLL 模块的情况下,系统才会将它们装载到内存空间中。

Windows 自己就将一些主要的系统功能以 DLL 模块的形式实现。

动态链接库( Dynamic Link Library )

动态链接库缩写为 DLL 。 DLL 是一些编译过的可执行程序模块、

数据或其他资源,可以被应用程序或其他 DLL 调用。

DLL 的应用非常广泛,可以实现多个应用程序的代码和资源共享。

动态链接库的组成 DLL 是一种磁盘文件,以 dll 、 DRV 、

FON 、 SYS 和许多以 EXE 为扩展名的系统文件都可以是 DLL 。

它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。

如果与其它 DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。

动态链接库的几点注意 DLL 中包含各种导出函数,用于向外界

提供服务。 DLL 有自己的数据段,但没有自己的堆

栈,使用与调用它的程序相同的堆栈。 一个 DLL 在内存中只有一个实例。 DLL 的编制与具体的编程语言及编译器

无关。

动态链接库的特点

共享资源 共享代码、资源和数据。 DLL 不仅可以

包含可执行的代码,还可以包括数据和各种资源等,扩大了库文件的使用范围。

方便应用程序的扩展 由于 DLL 能被应用程序动态载入内存。

所以,应用程序可以在需要时才将 DLL载入到内存中,这让程序的可维护性变得很高。

比如微软的操作系统经常需要升级,微软的程序员不必将操作系统代码都重写一遍,只需将需要升级的相关 DLL 文件重写即可。

DLL 与语言无关 一个小组成员共同完成一个软件项目。

每个人所使用的编程工具并不同,每人负责的部分所使用的编程语言都不同,如何合作完成项目呢?

使用 DLL 就可以解决这个问题,程序员提供自己完成代码的 DLL即可,主程序调用这些 DLL即可。

节省内存 如果多个应用程序调用的是同一个动态

链接库,那么这个 DLL 文件不会被重复加载到内存中,而是由这些应用程序共享同一个已载入内存的 DLL 。

在一个办公室中,一般大家会共用一个网络打印机,不会为每一个员工配置一台打印的。

在嵌入式系统中更有意义。

隐藏程序的细节 在某些情况下,用户可能想隐藏程序的

源代码,就可以采用 DLL 来实现, DLL的例程可以被应用程序访问,而不显示其中代码的细节。

可以有效地保护自己的知识产权。

节省内存 如果多个应用程序调用的是同一个动态

链接库,那么这个 DLL 文件不会被重复加载到内存中,而是由这些应用程序共享同一个已载入内存的 DLL 。

在一个办公室中,一般大家会共用一个网络打印机,不会为每一个员工配置一台打印的。

在嵌入式系统中更有意义。

动态链接库的实现

DLL 入口函数 每一个 DLL 必须有一个入口点, DLLM

ain 是一个缺省的入口函数。 DLLMain负责初始化 (Initialization) 和结束 (Termination) 工作,每当一个新的进程或者该进程的新的线程访问 DLL 时,或者访问 DLL 的每一个进程或者线程不再使用 DLL 或者结束时,都会调用 DLLMain 。

DLLMain 的函数原型 int WINAPI   DLLMain(HINSTANCE hinstance,

DWORD fdwReason,PVOID pvReserved ) { switch(fdwReason) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: return TRUE; } }

DLLMain 的函数的参数 hinstance 是动态库被调用时所传递来的一个指向自己

的句柄。 fdwReason 是一个说明动态库被调原因的标志。当进程

或线程装入或卸载动态连接库的时候,操作系统调用入口函数,并说明动态连接库被调用的原因。它所有的可能值为

DLL_PROCESS_ATTACH 进程被调用 DLL_THREAD_ATTACH 线程被调用 DLL_PROCESS_DETACH 进程被停止 DLL_THREAD_DETACH 线程被停止

lpReserved 是一个被系统所保留的参数。

top related