《动态连接库编程》PPT课件.ppt_第1页
《动态连接库编程》PPT课件.ppt_第2页
《动态连接库编程》PPT课件.ppt_第3页
《动态连接库编程》PPT课件.ppt_第4页
《动态连接库编程》PPT课件.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Windows编程实践,动态链接库,库,静态链接库 动态链接库,静态链接库,动态链接库,库,LIB,DLL,静态链接库,例题:建立并使用一个静态链接库 步骤1. VC6中建立一个工程工程类型: VC+6.0中new一个名称为libTest的static library工程,加入两个文件,/文件:lib.h #ifndef LIB_H #define LIB_H extern “C“ int add(int x,int y);/声明为C编译、连接方式的外部函数 #endif /文件:lib.cpp #include “lib.h“ int add(int x,int y) return x + y; ,编译与应用,在Debug目录下有个后缀名为.lib的文件 应用要点: 需要包含.h文件 需要链入.lib文件:两种方法 1. #pragma comment( lib , “debuglibTest.lib“ ) 2.Project-Setting中设置,什么是库,库不是个怪物,编写库的程序和编写一般的程序区别不大,只是库不能单独执行; 库提供一些可以给别的程序调用的函数等,别的程序要调用它必须以某种方式指明它要调用之。 动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定义及调用方式略有差异。,动态链接库,动态链接库DLL简介 简单DLL的开发 DLL的使用 MFC DLL的开发,动态链接库(DLL)简介,什么是动态链接库(1),动态链接库(Dynamic Link Library )是Windows的重要组成部分 之前学习的windows可执行程序都是exe程序,但Windows系统中动态链接库是数量最多的可执行程序 KERNEL32.DLL、USER32.DLL和GDI32.DLL、各种驱动程序文件如KEYBOARD.DRV、SYSTEM.DRV和MOUSE.DRV和显卡及打印机驱动程序都是动态链接库 动态链接库是其它应用程序在执行时能够动态链接和调用的一组服务或函数 可以利用Visual Studio自带的Depends.exe工具来查看与应用程序关联的所有DLL文件,什么是动态链接库(2),在程序开发中,将各种目标模块(.OBJ)、执行时期链接库(.LIB)文件,以及经常是已编译的资源(.RES)文件连结在一起,以便建立Windows的.EXE文件,称为“静态链接” “动态链接”是指Windows程序把一个模块中的函数调用链接到动态链接库模块中的实际函数上 动态链接与静态链接的区别:动态链接是在程序运行时完成,静态链接在编译时完成 动态链接库是一种能够实现动态链接的技术,函数模块,Windows程序,静态链接,动态链接,Windows程序,函数模块,动态链接库,动态链接库的意义,使用动态链接产生的exe文件比静态链接产生的exe文件小得多 使用动态链接的程序比相应静态链接程序具有更优化的内存使用 可以实现函数模块的二进制重用,多个应用程序可以共享动态链接库,动态链接库也可以调用其它动态链接库 在程序开发时函数模块可以独立开发 通过替换动态链接库,可以实现应用程序功能的升级,共享动态链接库,Windows程序B,函数模块,动态链接库,Windows程序A,动态链接库B,函数模块,动态链接库,动态链接库A,利用动态链接库实现软件升级,Windows程序,函数模块,动态链接库V1.0,函数模块,动态链接库V2.0,覆盖,升级之后,升级之前,简单DLL的开发,基本步骤,建立DLL工程 编写函数模块 产生动态链接库程序 在其它项目中使用动态链接库,分类,普通的Win32的DLL 直接用C、C+编写,不适用于MFC类 基于MFC的DLL 应用MFC类库编写,建立DLL工程,新建项目时选择DLL程序,DllMain,工程建好之后,默认代码如下: BOOL WINAPI DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) return TRUE; ,DllMain的作用,DllMain是动态链接库的执行入口,第一次执行dll时被调用 DllMain主要用于dll调用时初始化,以及dll退出时的清理工作 例如:在dll调用时初始化一些全局变量,在dll退出时销毁这些全局变量 通常情况下可以不编写DllMain,编写函数模块(1),为一个函数加上extern “C” _declspec (dllexport)就可以将函数导出为dll函数模块 例如: extern “C“ _declspec (dllexport) int add(int a,int b) return a+b; extern “C“ _declspec (dllexport) void message(LPCTSTR text) MessageBox(NULL,text,TEXT(“消息“),MB_OK); ,编写函数模块(2),如果使用C语言编写DLL,可以将extern “C” 去掉变为: _declspec (dllexport) int add(int a,int b) return a+b; _declspec (dllexport) void message(LPCTSTR text) MessageBox(NULL,text,TEXT(“消息“),MB_OK); 如果DLL使用C+编写,通常需要加上extern “C”,导出内容,可以导出函数、类、资源等 中间函数不需要导出 可以选择导出方式 两种导出方法 使用DEF文件 使用关键字_declspec(dllexport),使用模块定义文件DEF导出,创建DEF文件,与工程名相同(dlltest.DEF) 内容 LIBRARY语句说明.def文件相对应的DLL EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用); def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行 LIBRARY DLLTEST ; dlltest.def :导出dll函数 EXPORTS add 1,函数名称,编号,使用关键字_declspec(dllexport)导出,申明导出函数: _declspec(dllexport) 函数返回值 函数名(参数表),编译产生dll,编译将产生一个lib文件,一个dll文件,使用DLL,隐式链接(静态调用),将编译dllTest工程所生成的.lib和.dll文件拷入dllCall工程所在的路径,dllCall执行下列代码: #pragma comment(lib,“dllTest.lib“) extern “C“ _declspec(dllimport) add(int x,int y); int main(int argc, char* argv) int result = add(2,3); printf(“%d“,result); return 0; ,隐式链接(静态链接),告诉编译器与DLL相对应的.lib文件所在的路径及文件名 #pragma comment(lib,“dllTest.lib“) 也可以通过Project-Setting设置 声明导入函数, extern “C“ _declspec(dllimport) add(int x,int y) 语句中的_declspec(dllimport)发挥这个作用。,定位DLL的搜索路径,Windows 首先搜索“已知 DLL”,如 Kernel32.dll 和 User32.dll 当前进程的可执行模块所在的目录 当前目录 Windows 系统目录。GetSystemDirectory 函数检索此目录的路径 Windows 目录。GetWindowsDirectory 函数检索此目录的路径 PATH 环境变量中列出的目录,DLL导出类,我们往往通过在类的声明头文件中用一个宏来决定使其编译为class _declspec(dllexport) class_name还是class _declspec(dllimport) class_name版本,这样就不再需要两个头文件。本程序中使用的是: #ifdef DLL_FILE class _declspec(dllexport) class_name /导出类 #else class _declspec(dllimport) class_name /导入类 #endif,在其它项目中使用动态链接库(1),将编译产生的dll文件和lib文件,拷贝到要使用dll的项目的当前目录下,测试程序(1),#include #include extern “C“ _declspec (dllimport) int add(int a,int b); extern “C“ _declspec (dllimport) void message(LPCTSTR text); int main() printf(“10+20=%d“,add(10,20); message(TEXT(“Hello world“); return 0; ,测试程序(2),注意在使用dll的程序中一定要对dll中的函数进行声明,并且函数的形式需要与dll中的函数形式相同(上页ppt中的红字部分) 编译器链接时需要使用生成dll程序时产生的lib文件,因此使用该库的工程需要设置依赖库属性,设置附加依赖库,运行结果,显式链接(动态链接),通过三个API函数来实现 HINSTANCE hdll; hdll = LoadLibrary(“dllname.dll”); typedef int(*lpMinFun)(int, int); /定义函数指针类型 lpMinFun pmin; pmin = (lpMinFun) GetProcAddress(hdll, “funcname”); Int r = pmin(6,7); FreeLibrary(hdll);,显式链接方式的优点,真正体现了动态链接库的灵活性 不需在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论