动态连接库编程.ppt

上传人:wuy****n92 文档编号:87422184 上传时间:2023-04-16 格式:PPT 页数:42 大小:200.50KB
返回 下载 相关 举报
动态连接库编程.ppt_第1页
第1页 / 共42页
动态连接库编程.ppt_第2页
第2页 / 共42页
点击查看更多>>
资源描述

《动态连接库编程.ppt》由会员分享,可在线阅读,更多相关《动态连接库编程.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Windows编程实践 动态链接库动态链接库库n静态链接库n动态链接库静态链接库动态链接库库LIBDLL静态链接库n例题:建立并使用一个静态链接库n步骤1.VC6中建立一个工程工程类型:nVC+6.0中new一个名称为libTest的static library工程 加入两个文件n/文件:lib.h#ifndef LIB_H#define LIB_Hextern C int add(int x,int y);/声明为C编译、连接方式的外部函数#endif/文件:lib.cpp#include lib.hint add(int x,int y)return x+y;编译与应用n在Debug目录下

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

3、n动态链接库(Dynamic Link Library)是Windows的重要组成部分n之前学习的windows可执行程序都是exe程序,但Windows系统中动态链接库是数量最多的可执行程序nKERNEL32.DLL、USER32.DLL和GDI32.DLL、各种驱动程序文件如KEYBOARD.DRV、SYSTEM.DRV和MOUSE.DRV和显卡及打印机驱动程序都是动态链接库n动态链接库是其它应用程序在执行时能够动态链接和调用的一组服务或函数n可以利用Visual Studio自带的Depends.exe工具来查看与应用程序关联的所有DLL文件什么是动态链接库(2)n在程序开发中,将各种目

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

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

6、程n编写函数模块n产生动态链接库程序n在其它项目中使用动态链接库分类n普通的Win32的DLLn直接用C、C+编写,不适用于MFC类n基于MFC的DLLn应用MFC类库编写建立DLL工程n新建项目时选择DLL程序DllMainn工程建好之后,默认代码如下:BOOL WINAPI DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)return TRUE;DllMain的作用nDllMain是动态链接库的执行入口,第一次执行dll时被调用nDllMain主要用于dll调用时初始化,以及dll退出时的清理工作n例如:

7、在dll调用时初始化一些全局变量,在dll退出时销毁这些全局变量n通常情况下可以不编写DllMain编写函数模块(1)n为一个函数加上extern“C”_declspec(dllexport)就可以将函数导出为dll函数模块n例如: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)n如果使用C语言编写DLL,可以将extern

8、“C”去掉变为:_declspec(dllexport)int add(int a,int b)return a+b;_declspec(dllexport)void message(LPCTSTR text)MessageBox(NULL,text,TEXT(消息),MB_OK);n如果DLL使用C+编写,通常需要加上extern“C”导出内容n可以导出函数、类、资源等n中间函数不需要导出n可以选择导出方式n两种导出方法n使用DEF文件n使用关键字_declspec(dllexport)使用模块定义文件DEF导出n创建DEF文件,与工程名相同(dlltest.DEF)n内容nLIBRARY语

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

10、用)n将编译dllTest工程所生成的.lib和.dll文件拷入dllCall工程所在的路径,dllCall执行下列代码:n#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;隐式链接(静态链接)n告诉编译器与DLL相对应的.lib文件所在的路径及文件名n#pragma comment(lib,dllTest.lib)n也可以通过Project

11、-Setting设置n声明导入函数,nextern C _declspec(dllimport)add(int x,int y)n语句中的_declspec(dllimport)发挥这个作用。定位DLL的搜索路径nWindows 首先搜索“已知 DLL”,如 Kernel32.dll 和 User32.dlln当前进程的可执行模块所在的目录n当前目录nWindows 系统目录。GetSystemDirectory 函数检索此目录的路径nWindows 目录。GetWindowsDirectory 函数检索此目录的路径nPATH 环境变量中列出的目录DLL导出类n我们往往通过在类的声明头文件中用

12、一个宏来决定使其编译为class _declspec(dllexport)class_name还是class _declspec(dllimport)class_name版本,这样就不再需要两个头文件。本程序中使用的是:#ifdef DLL_FILEclass _declspec(dllexport)class_name/导出类#elseclass _declspec(dllimport)class_name/导入类#endif在其它项目中使用动态链接库(1)n将编译产生的dll文件和lib文件,拷贝到要使用dll的项目的当前目录下测试程序(1)#include#include extern

13、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)n注意在使用dll的程序中一定要对dll中的函数进行声明,并且函数的形式需要与dll中的函数形式相同(上页ppt中的红字部分)n编译器链接时需要使用生成dll程序时产生的lib文件,因此使用该库的工程需要设置依赖库属性设置附加依赖库运行结果显

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

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

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁