湖南网站服务,51ppt模板网免费,官方网站建设步骤,肇庆企业网站关键词优化教程一、概念DLL#xff1a;Dynamic Link Library#xff0c;即动态链接库#xff0c;这种库包含了可由多个程序同时使用的代码和数据。它是microsoft在windows操作系统中实现共享函数库概念的一种实现方式。其中windows中 一些作为DLL实现的文件有#xff1a;ActiveX控件… 一、概念DLLDynamic Link Library即动态链接库这种库包含了可由多个程序同时使用的代码和数据。它是microsoft在windows操作系统中实现共享函数库概念的一种实现方式。其中windows中 一些作为DLL实现的文件有ActiveX控件.ocx文件如windows上的日历控件。控制面板.cpl文件控制面板中的每一项都是一个专用的DLL。设备驱动程序.drv文件如控制打印到打印机的打印机驱动程序。二、由来DLL最初用于节约应用程序所需要的磁盘和内存空间。早前在传统的非共享库中一部分代码简单地附加到调用的程序中。如果两个程序同时调用同一个子程序就会出现两份那段代码。相反许多应用共享的代码能够切分到一个DLL中在硬盘上存为一个文档在内存中只需使用一个实例。三、DLL的优缺点优点1节省内存和代码重用当多个程序使用同一个函数库时DLL可以减少在磁盘和物理内存中加载代码的重复量且有助于代码的重用。2模块化DLL有助于促进模块式程序开发。模块化允许仅仅更改几个应用程序共享使用的一个DLL中的代码和数据而不需要更改应用程序自身。这种模块话的基本形式允许如Microsoft Office、Microsoft Visual Studio、甚至windows自身这样大的应用程序 使用较为紧凑的补丁和服务包。缺点DLL Hell即DLL地狱指几个应用程序在使用同一个共享的DLL库时发生版本冲突。究其原因八个字成也共用败也共用。因为DLL Hell正是由于动态链接库可与其他程序共用函数、资源所导致。主要有两种情况设想这样一个场景程序A会使用1.0版本的动态链接库X则在程序A安装到系统时会同时安装该1.0版本的动态链接库X。假设另一个程序B也会使用到动态链接库X那么程序B直接复制到硬盘中即可正常运行因为动态链接库已经存在于系统中。然而有一天另一程序C也要使用动态链接库X但是由于程序C开发的时间较晚其需要较新版本---2.0版本的动态链接库X。则在程序C被安装到系统时2.0版本的动态链接库X 也必须随之安装到系统中此时系统中1.0版本的动态链接库将被2.0版本所取代替换。情况1新版本的动态链接库不兼容旧版本。如A何B需要X所提供的功能在升级到2.0后新版本的X竟然把此功能取消了很难想象吧呵呵但有时候就是如此....。则此时虽然C能正常运行但A和B均无法工作了。情况2新版本的动态链接库兼容旧版本但是存在一个bug。可看下面的例子仅仅为了说明问题// X1.0 version
void func(int count)
{if(count 0)count 0;....
}
// X2.0 version
void func(int count)
{//负数处理被移除!...
}
一旦出现count为负数的情况则程序A在新版本的处理下就会有问题。解决办法Side-by-side Assembly是windows Xp以及以上系统解决动态链接库版本冲突所使用的技术重点在于编译程序时由VS生成一个manifest文件指明当前应用程序所使用的动态链接库版本号发布程序时需同时发布该manifest文件供客户计算机上的DLL Loader根据manifest加载适当版本的DLL若不发布该项manifest客户机则按默认版本加载DLL。下图为其典型的场景四、DLL与lib的关系咋一看lib是静态链接库DLL是动态链接库一个编译时提供一个运行时提供完了。其实没那么简单 lib也有静态lib和动态lib之分。静态lib它将导出声明后面会讲和实现均放到lib中编译后所有代码都嵌入到宿主程序中去。动态lib相当于一个h文件它是对实现部分.DLL的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中运行时需要相应的DLL文件的支持否则无法工作。当生成一个新的DLL时也会有配套的lib产生即二者需一起分发此时的lib即为动态lib后面会有还有实验。五、如何生成一个DLL在VC6.0开发环境下打开File\New\Project选项可以选择Win32 Dynamic-Link Library或MFC AppWizard【dll】来以不同的方式创建Non-MFC DLL、Regular DLL、Extension DLL等不同种类的动态链接库。下面以选择Win32 Dynamic-Link Library方式来创建一个DLL实现加法运算1、创建一个Win32 Dynamic-Link Library方式的空工程取名为myDLL2、分别添加头文件(.h)和源文件(.cpp)// mydll.h file
extern C _declspec(dllexport) int add(int a, int b);//mydll.cpp file
#include mydll.h
int add(int a, int b) //该DLL需要导出的函数功能加法
{return a b;
}
说明1前面的 extern “C” 告诉编译器函数可以在本模块或其他模块中使用其中“C”表明需按照C语言方式编译和连接它因为C编译时会对函数名进行修饰用于实现函数重载而C里面没有这个功能所以需要用extern C在头文件进行声明的时候加以区分以便链接时能进行正确地函数名查找。2_declspec(dllexport)为导出函数关键字意为需从DLL中导出该函数以便使用。3、编译连接在进行编译连接后会在Debug目录下找到DLL文件和对应的lib文件六、如何调用一个DLL下面实现两种调用方式单独.dll 和.h .lib .dll结合注需把对应的 .dll 文件以及.lib 文件和.h文件结合方式时拷贝至调用的程序目录下1单纯使用.dll#includewtypes.h
#include winbase.h
#include iostream
//导入声明亦可以不加如果加上可加快程序运行
_declspec(dllimport) int Add(int a, int b); typedef int(*pAdd)(int a,int b);int main()
{HINSTANCE hDLL;pAdd Add;hDLLLoadLibrary(mydll.dll); //加载 DLL文件if(hDLL NULL)std::coutError!!!\n;//取DLL中的函数地址以备调用Add(pAdd)GetProcAddress(hDLL,add); int a Add(5,8);std::couta: astd::endl;FreeLibrary(hDLL);return 0;
}
输出结果2.h .lib .dll 结合方式#includewtypes.h
#include winbase.h
#include iostream
#include mydll.h
#pragma comment(lib,mydll.lib)
//将mydll.lib库文件连接到目标文件中即本工程
extern C_declspec(dllimport) int add(int a,int b);
int main()
{int a add(5,8);std::couta: astd::endl;return 0;
}
输出反例演示此时如果去掉 .dll 文件即只有.lib 和 .h文件则会出错完关注它你就可以得到很多你想要的C/C开发工具及学习视频资料