DLL的全称是Dynamic Link Library, 中文叫做“动态链接文件”。在Windows操作系统中, DLL对于程序执行是非常重要的, 因为程序在执行的时候, 必须链接到DLL文件, 才能够正确地运行。而有些DLL文件可以被许多程序共用。因此, 程序设计人员可以利用DLL文件, 使程序不至于太过巨大.
动态链接库体现了程序设计中的模块化,将应用程序划分为几个小的模块,有助于促进代码的模块化、代码重用、内存的有效使用和减少所占用的磁盘空间,有利于小组内部成员的分工与合作。
DLL是动态连接库。使用动态连接库的一些好处是:
1.多个应用程序共享代码和数据:比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态连接库实现的。
2.在钩子程序过滤系统消息时必须使用动态连接库。
3.动态连接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作。而且,各个模块可以独立升级。如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态连接库中,让小组的其他成员使用。
4.为了实现应用程序的国际化,往往需要使用动态连接库。使用动态连接库可以将针对某一国家、语言的信息存放在其中。对于不同的版本,使用不同的动态连接库。在使用AppWizard生成应用程序时,我们可以指定资源文件使用的语言,这就是通过提供不同的动态连接库实现的。
例如在程序中
通过
//_declspect(dllimport) int A(int a,int b);
告诉编译器,此函数是动态链接库中的函数.
另外通常写Dll时在dll1.h中声明函数,然后在DllTest.h中包含这个头文件,
另外会用一组宏来取代_declspec(dllimport)
#ifdef DLL1_API
#else
#define DLL1_API extern "C" _declspec(dllimport)//希望导出的函数名不被改变,加extern "C"大写
的C!
#endif
下面是一个简单的DLL的应用:
DLL中的声明:
_declspec(dllexport) int add(int a,int b)
{
return a+b;
}
_declspec(dllexport) int subtract(int a,int b)
{
return a-b;
}
主程序:
void CDllTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
HINSTANCE hInst;
hInst=LoadLibrary("Dll3.dll");
typedef int (/*_stdcall*/ *ADDPROC)(int a,int b);
ADDPROC Add=(ADDPROC)GetProcAddress(hInst,MAKEINTRESOURCE(1));
if(!Add)
{
MessageBox("获取函数地址失败!");
return;
}
CString str;
str.Format("5+3=%d",Add(5,3));
MessageBox(str);
FreeLibrary(hInst);//当不使用DLL时,调用FreeLibrary减少DLL的使用计数,
//释放DLL资源,减少系统负担
}
void CDllTestDlg::OnBtnSubtract()
{
代码和前一个函数类似(略)
}
此外,DLL不是独立运行的程序,它是某个程序的一个部分,它只能由所属的程序调用。