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

21
项项 12 项项项项项项 项 :- PDA 项项项项项 DLL 项项2 项项项项项项项项项 动动动动动动动动 动动动动动动动动动动 动动动动动动动动动动

Upload: petra-nichols

Post on 30-Dec-2015

130 views

Category:

Documents


5 download

DESCRIPTION

项目 12 :动态链接库-在 PDA 研发中使用 DLL 文件( 2 ). 本节课程主要知识点 动态链接库的加载 动态链接库的静态加载 动态链接库的动态加载. 重点和难点. 重点 动态链接库的加载方法 难点 静态调用中建立关联. 动态链接库的加载. 动态链接库的加载. 动态链接库的加载分为即静态加载方式和动态加载方式。 静态加载方式是在编译程序代码时即完成对 DLL 的加载,应用程序结束时卸载 DLL 。 动态加载方式是使用用 API 函数来加载和卸载 DLL 的。. 动态链接库的静态加载. 动态链接库的静态加载. - PowerPoint PPT Presentation

TRANSCRIPT

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

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

( 2) 本节课程主要知识点 动态链接库的加载 动态链接库的静态加载 动态链接库的动态加载

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

重点和难点重点 动态链接库的加载方法

难点 静态调用中建立关联

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

动态链接库的加载

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

动态链接库的加载 动态链接库的加载分为即静态加载方式

和动态加载方式。 静态加载方式是在编译程序代码时即完

成对 DLL 的加载,应用程序结束时卸载DLL 。

动态加载方式是使用用 API 函数来加载和卸载 DLL 的。

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

动态链接库的静态加载

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

动态链接库的静态加载 静态加载方式由编译系统完成对 DLL 的

加载。 应用程序完成对 DLL 的卸载。 加载方法简单,但不够灵活。

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

LIB 文件用来做什么? 在生成一个 DLL 文件时,链接程序会自

动生成一个与之对应的 LIB 文件。 LIB 文件包含了每一个 DLL 导出函数的

符号名和可选的标识号,但是并不含有实际的代码。

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

编译应用程序 把生成动态连接库时生成的 LIB 文件和

DLL 文件加入到应用程序的工程中。 通过静态链接方式编译生成应用程序时,

应用程序中的调用函数与 LIB 文件中导出符号相匹配,这些符号或标识号进入到生成的 EXE 文件中。

LIB 文件作为 DLL 的替代文件被编译到应用程序工程中。

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

DLL 中函数的调用( 1/2 ) 当应用程序运行过程中需要加载 DLL 文

件时, Windows CE 根据 LIB 中的信息发现并加载 DLL 。

然后通过符号名或标识号实现对 DLL 函数的动态调用。

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

DLL 中函数的调用( 2/2 ) 所有被应用程序调用的 DLL 文件都会在

应用程序 EXE 文件加载时被加载在到内存中。

可执行程序直接通过函数名调用 DLL 的输出函数,调用方法和程序内部其他的函数是一样的。

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

DLL 如何共享? DLL 静态加载后,系统会建立对该 DLL

的调用记录。 如还有其它程序使用该动态链接库,则

Windows CE 对 DLL 的应用记录减 1 ,直到所有相关程序都结束对该 DLL 的使用时才释放它。

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

DLL 静态加载实例 利用 PB 或 VS2005 生成动态链库 wcedll.

dll 和 wcedll.lib 文件。 利用 EVC 创建一个测试工程 wcetest ,

用以测试动态链接库的静态加载。

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

设置依赖关系 将两个库文件 wcedll.dll 和 wcedll.lib 拷

贝到当前测试工程 wcetest 所在的文件夹下。

选择 Projects 菜单,选择 Setting… ,进入 Link 标签,在 Category 下拉框中找到Input ,在 Object/library modules 编辑框中添加 wcedll.lib 一项内容。

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

运行测试代码 编译并下载 wcetest.exe ,保证代码没有

错误。 在目标平台上找到 wcetest.exe 应用程序,

双击它,让其运行起来。 通过 EVC 的 Remote Process Viewer 就可

以看到 wcetest.exe 已经运行,而且 wcedll.dll 已经加载。

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

动态链接库的动态加载

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

动态链接库的动态加载 动态调用方式是由程序员编程使用 API

函数来加载和卸载 DLL 。 使用上较复杂,但能更加有效地使用内

存,是编制大型应用程序时的重要方式。 是一般常见的动态链接库的加载方法。 在嵌入式系统中更为常见。

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

如何实现 DLL 动态调用 ?

在应用程序中用 LoadLibrary 显式的将自己所做的动态连接库调进来。

用 GetProcAddress() 获取想要引入的函数。 如同本应用程序自定义的函数一样来调

用该引入函数。 在应用程序退出之前,用 FreeLibrary 释

放动态连接库。

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

DLL 动态加载实例 利用 EVC 创建一个测试工程 wcetest1 ,

用以测试动态链接库的动态加载。 与静态调用 DLL 相比,程序中增加以下

代码 添加 wcedll 动态链接库工程的实现函数的定

义。 利用 LoadLibrary API 函数动态加载动态链

接库,利用 GetProcAddress API 函数获取需要引用的函数。

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

测试程序的源代码 #include <windows.h> typedef void (*printH) (void); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevIn

stance,LPTSTR szCmdLine,int iCmdShow) { HANDLE hModule=LoadLibrary(TEXT(“wcedll.dll”));

if(hModule==NULL) { return 0; } else { printH PrintHello= (printH) GetProcAddress(hModule,TEXT("PrintHello")); PrintHello(); }

FreeLibrary(TEXT("wcedll.dll")); return 0; }

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

运行测试代码 编译并下载 wcetest1.exe ,保证代码没有

错误。 在目标平台上找到 wcetest1.exe 应用程序,

让其运行起来。 通过 EVC 的 Remote Process Viewer 就可

以看到 wcetest1.exe 已经运行而且 wcedll.dll 已经加载。

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

Windows CE 如何定位 DLL

定位 DLL 的搜索顺序包含 EXE 文件的目录 进程的当前工作目录 Windows CE 系统目录 Windows CE 目录列在 Path 环境变量中的一系列目录