《动态连接库编程》ppt课件

上传人:tian****1990 文档编号:74610262 上传时间:2019-01-28 格式:PPT 页数:42 大小:261KB
返回 下载 相关 举报
《动态连接库编程》ppt课件_第1页
第1页 / 共42页
《动态连接库编程》ppt课件_第2页
第2页 / 共42页
《动态连接库编程》ppt课件_第3页
第3页 / 共42页
《动态连接库编程》ppt课件_第4页
第4页 / 共42页
《动态连接库编程》ppt课件_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《《动态连接库编程》ppt课件》由会员分享,可在线阅读,更多相关《《动态连接库编程》ppt课件(42页珍藏版)》请在金锄头文库上搜索。

1、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 +

2、y; ,编译与应用,在Debug目录下有个后缀名为.lib的文件 应用要点: 需要包含.h文件 需要链入.lib文件:两种方法 1. #pragma comment( lib , “debuglibTest.lib“ ) 2.Project-Setting中设置,什么是库,库不是个怪物,编写库的程序和编写一般的程序区别不大,只是库不能单独执行; 库提供一些可以给别的程序调用的函数等,别的程序要调用它必须以某种方式指明它要调用之。 动态链接库与静态链接库在编写和调用上的不同体现在库的外部接口定义及调用方式略有差异。,动态链接库,动态链接库DLL简介 简单DLL的开发 DLL的使用 MFC DLL

3、的开发,动态链接库(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工具来查看与应用程序关联的所

4、有DLL文件,什么是动态链接库(2),在程序开发中,将各种目标模块(.OBJ)、执行时期链接库(.LIB)文件,以及经常是已编译的资源(.RES)文件连结在一起,以便建立Windows的.EXE文件,称为“静态链接” “动态链接”是指Windows程序把一个模块中的函数调用链接到动态链接库模块中的实际函数上 动态链接与静态链接的区别:动态链接是在程序运行时完成,静态链接在编译时完成 动态链接库是一种能够实现动态链接的技术,函数模块,Windows程序,静态链接,动态链接,Windows程序,函数模块,动态链接库,动态链接库的意义,使用动态链接产生的exe文件比静态链接产生的exe文件小得多 使

5、用动态链接的程序比相应静态链接程序具有更优化的内存使用 可以实现函数模块的二进制重用,多个应用程序可以共享动态链接库,动态链接库也可以调用其它动态链接库 在程序开发时函数模块可以独立开发 通过替换动态链接库,可以实现应用程序功能的升级,共享动态链接库,Windows程序B,函数模块,动态链接库,Windows程序A,动态链接库B,函数模块,动态链接库,动态链接库A,利用动态链接库实现软件升级,Windows程序,函数模块,动态链接库V1.0,函数模块,动态链接库V2.0,覆盖,升级之后,升级之前,简单DLL的开发,基本步骤,建立DLL工程 编写函数模块 产生动态链接库程序 在其它项目中使用动态

6、链接库,分类,普通的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调用时初始化一些全局变量,在

7、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,可以将exte

8、rn “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

9、.DEF) 内容 LIBRARY语句说明.def文件相对应的DLL EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用); def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行 LIBRARY DLLTEST ; dlltest.def :导出dll函数 EXPORTS add 1,函数名称,编号,使用关键字_declspec(dllexport)导出,申明导出函数: _declspec(dllexport) 函数返回值 函数名(参数表),编译产生dll,编译将产生一

10、个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文件所在的路径及文件

11、名 #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 目录。GetWindowsDirect

12、ory 函数检索此目录的路径 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),将

13、编译产生的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中的函数进行声明,并且函数的

14、形式需要与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);,显式链接方式的优点,真正体现了动态链接库的灵活性 不需在开发阶段把函数代码链接信息插入到EXE中 不需要导入库文件LIB,COM技术,什么是COM,COM是组件对象模型(Component Object Model )是微软的一种组件技术 最初COM的目的是将C+编写的对象导出为DLL COM本质论(作者Don Box是COM技术的主要研发人员)中说:COM是一个更好的C+ 可以这样认为:COM是一种二进制级别的对象,COM的相关技术,COM+ ActiveX DCOM OLE ATL .NET,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号