目录
DLL,全称“Dynamic Link Library”,中文名为“动态链接库”,是一种在Windows操作系统中常见的库文件格式。它包含了可以由多个程序同时使用的代码和数据。与静态链接库(Static Link Library,.lib文件)不同,动态链接库在程序运行时才被加载到内存中,因此可以节省内存空间,并允许程序在不重新编译的情况下更新库文件。
DLL文件通常包含以下类型的函数和数据:
导出函数:这些函数可以由其他程序调用。它们被编译并包含在DLL中,以便其他程序可以通过动态链接来调用它们。
资源:DLL可以包含图标、位图、字符串等资源,这些资源可以被其他程序使用。
数据:DLL也可以包含共享数据,这些数据可以在多个程序之间共享。
使用DLL的好处包括:
资源共享:多个应用程序可以同时使用同一个DLL中的函数和数据,从而节省磁盘和内存空间。
模块化:DLL允许将代码划分为独立的模块,这使得代码更易于管理和维护。
插件化:应用程序可以使用DLL作为插件来扩展其功能,而无需修改应用程序本身。
版本控制:通过更新DLL文件,可以在不重新编译整个应用程序的情况下更新程序的功能。
然而,使用DLL也需要注意一些问题,如DLL的依赖管理、版本冲突以及安全性等。
1、创建dll
创建mydll工程,移除默认文件,添加以下文件
test.h
#ifdef MYDLL_EXPORTS
#define MATH_API __declspec(dllexport)
#else
#define MATH_API __declspec(dllimport)
#endif
MATH_API int Add(int a, int b);
MATH_API int Sub(int a, int b);
test.cpp
#include "test.h"
int Add(int a, int b) {
return a + b;
}
int Sub(int a, int b) {
return a - b;
}
Source.def
LIBRARY
EXPORTS
Add
Sub
编译后生成mydll.lib和mydll.dll文件
2、使用dll
创建控制台项目,添加以下文件
testdll.cpp
#include <iostream>
#include "windows.h"
typedef int (*lpAddFun)(int, int);//宏定义函数指针类型
typedef int (*lpSubFun)(int, int);//宏定义函数指针类型
int main()
{
std::cout << "Hello World!\n";
HINSTANCE hDll;//DLL 句柄
lpAddFun addFun;//函数指针
lpSubFun subFun;//函数指针
hDll = LoadLibrary(L"mydll.dll");//动态获取dll文件的路径
if (hDll != nullptr)
{
addFun = (lpAddFun)GetProcAddress(hDll, "Add");//根据函数名在dll文件中获取该函数的地址
subFun = (lpSubFun)GetProcAddress(hDll, "Sub");
if (addFun != nullptr)
{
int result = addFun(2, 3);
int result2 = subFun(10, 6);
printf("2+3=%d\n", result);
printf("10-6=%d", result2);
}
FreeLibrary(hDll);
}
return 0;
}
将mydll.lib和mydll.dll文件拷贝到exe文件所在目录下
Hello World!
2+3=5
10-6=4