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

Post on 30-Dec-2015

130 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

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

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

难点 静态调用中建立关联

动态链接库的加载

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

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

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

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

动态链接库的静态加载

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

动态链接库的动态加载

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

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

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

如何实现 DLL 动态调用 ?

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

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

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

放动态连接库。

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

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

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

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

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

测试程序的源代码 #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; }

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

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

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

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

Windows CE 如何定位 DLL

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

top related