DLL动态链接库.docx
《DLL动态链接库.docx》由会员分享,可在线阅读,更多相关《DLL动态链接库.docx(10页珍藏版)》请在冰豆网上搜索。
DLL动态链接库
2012-07-2123:
41
使用VS2008创建和调用动态链接库
1.什么是动态链接库
A dynamiclibraryconsistsofroutinesthatareloadedintoyourapplicationatruntime.Whenyoucompileaprogramthatusesadynamiclibrary,thelibrarydoesnotbecomepartofyourexecutable—itremainsasaseparateunit.
动态链接库是一个函数和变量的集合,在调用它的程序运行时才被加载。
因此,动态链接库和可执行程序是分离的。
使用动态链接库具有以下优点:
(1)隐藏源代码;
(2)实现代码重用;(3)当程序调用DLL中的函数时不需要重新编译,提高编译速度;(4)当多个程序调用同一DLL中函数时,内存中只有一个副本,节省内存空间;(4)可通过替换DLL来实现程序的维护和升级。
当在应用程序中加载DLL时,有两种方法来调用导出的DLL函数,它们分别为加载时动态链接和运行时动态链接。
在加载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显式调用。
要使用加载时动态链接,请在编译和链接应用程序时提供头文件(.h)和导入库文件(.lib)。
当您这样做时,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置。
在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx函数以在运行时加载DLL。
成功加载DLL后,可以使用GetProcAddress函数获得要调用的导出的DLL函数的地址。
在使用运行时动态链接时,无需使用导入库文件。
可以根据下面的 准则来判断使用哪一种链接方式。
(1)启动性能如果应用程序的初始启动性能很重要,则应使用运行时动态链接。
(2)易用性在加载时动态链接中,导出的DLL函数类似于本地函数。
这使您可以方便地调用这些函数。
(3)应用程序逻辑在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。
在开发多语言版本时,这一点很重要。
2. 创建动态链接库
2.1 打开VisualStudio2008,File->New->Project…,选择Win32ConsoleApplication,Name设置为myDllTest。
2.2Applicationtype设置为Dll,勾选Emptyproject,单击Finish按钮。
2.3新建myDllTest.h文件,内容如下:
#ifndefMY_DLL_TEST_H
#defineMY_DLL_TEST_H
#ifdefEXPORTING_DLL
#defineAPI_TYPE__declspec(dllexport)
#else
#defineAPI_TYPE__declspec(dllimport)
#endif
API_TYPEdoublemy_add(doublex,doubley);
API_TYPEdoublemy_subtract(doublex,doubley);
API_TYPEdoublemy_times(doublex,doubley);
#endif
2.4新建myDllTest.h文件,内容如下:
#include"myDllTest.h"
#defineEXPORTING_DLL
doublemy_add(doublex,doubley)
{
returnx+y;
}
doublemy_subtract(doublex,doubley)
{
returnx-y;
}
doublemy_times(doublex,doubley)
{
returnx*y;
}
2.5分别在Debug和Release模式下编译,这时在文件夹myDllTest\Debug和myDllTest\Release内都有myDllTest.dll和myDllTest.lib文件,将myDllTest\Debug里面的myDllTest.lib重新命名为myDllTestd.lib。
只需保留myDllTest\Release中的dll文件。
2.6myDllTest.dll,myDllTestd.lib,myDllTest.lib和myLibTest.h是我们最终交付给用户的文件。
3.使用加载时动态链接方式调用动态链接库
3.1 如果工程比较大,则可以在本地硬盘的其它位置新建一个文件夹,命名为myDllTest,再新建三个子文件夹bin,include和lib,将DLL文件放到bin中,H文件放到include中,LIB文件放到lib中。
然后打开环境变量编辑器(在开始里面直接输入编辑系统环境变量,然后搜索即可)。
新建环境变量myLibTest,变量值为myDllTest文件夹所在目录。
然后编辑Path环境变量,添加语句%myDllTest%\bin;(不同的语句用;间隔)。
3.2 打开VisualStudio2008,Tools->Options->ProjectsandSolutions->VC++Directories,在右端的Showdirectoriesfor下拉列表中选择Includefiles,添加记录$(myDllTest)\include。
然后选择Libraryfiles,添加记录$(myDllTest)\lib。
单击OK按钮,然后重启电脑。
工程比较小时,可将DLL,H和LIB文件直接复制到当前工程下,不需要添加环境变量。
这时在包含对应头文件时应当使用双引号而不是尖括号。
3.3 新建一个工程,此处假设为Win32ConsoleApplication,新建文件main.cpp,内容如下:
#include
#include
usingnamespacestd;
#ifdef_DEBUG
#pragmacomment(lib,"myDllTestd.lib")
#else
#pragmacomment(lib,"myDllTest.lib")
#endif
intmain(intargc,char**argv)
{
doublex=2.5;
doubley=1.7;
cout< cout< cout<
return0;
}
也可以在Project->Properties中添加相应的AdditionalDependences,如下所示。
Debug模式下添加Debug模式下编译的LIB文件,Release模式下添加Release模式下编译的LIB文件。
3.4按下快捷键Ctrl+5,编译程序,输出以下结果。
注1:
生成应用程序后,把所需要的DLL文件复制到程序所在目录下。
否则会出现以下错误。