0%

动态链接库

💡 TIP

动态链接库(Dynamic Link Library,简称DLL)是包含可以由多个程序共享使用的代码和数据的文件。这种技术使程序能够高效地复用资源、减少重复代码以及节省内存空间。

动态链接库的特点:

  1. 动态加载:程序运行时,DLL文件才会被加载到内存中。

  2. 共享资源:多个程序可以同时使用同一个DLL文件,减少重复代码占用的磁盘和内存资源。

  3. 模块化开发:通过动态链接库,可以将应用程序拆分为多个模块,方便独立开发、测试和部署。

  4. 可更新性:更新程序时,只需替换DLL文件,无需更改主程序。


DLL的应用场景:

  1. 共享代码和功能:如Windows的系统功能(user32.dllkernel32.dll)。

  2. 插件系统:支持动态加载的插件,提供功能扩展。

  3. 跨语言调用:通过DLL,允许不同编程语言的程序共享同一段功能代码。

  4. 节省资源:避免重复代码的加载。


使用动态链接库的注意事项:

  1. 版本兼容性:更新DLL时必须保证接口兼容,否则可能导致主程序崩溃。

  2. 依赖问题:动态链接库可能依赖其他库,必须确保相关库也被正确部署。

  3. 安全性:动态链接库容易受到DLL劫持(DLL Hijacking)攻击,加载DLL时需指定明确路径或使用签名校验。


如何创建和使用动态链接库?

C++(Windows平台示例)
创建一个简单的动态链接库(.dll)并调用。

创建DLL:
  1. 创建mydll.cpp文件:

1
2
3
4
5
#include <iostream>

extern "C" __declspec(dllexport) void HelloWorld() {
std::cout << "Hello, World from DLL!" << std::endl;
}
  1. 使用命令行编译为DLL:

1
cl /LD mydll.cpp

生成的mydll.dll就是动态链接库。

调用DLL:
  1. 创建main.cpp文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <windows.h>
#include <iostream>

typedef void (*HelloWorldFunc)();

int main() {
HMODULE hModule = LoadLibrary(TEXT("mydll.dll"));
if (hModule) {
HelloWorldFunc hello = (HelloWorldFunc)GetProcAddress(hModule, "HelloWorld");
if (hello) {
hello();
}
FreeLibrary(hModule);
} else {
std::cerr << "Failed to load DLL" << std::endl;
}
return 0;
}
  1. 编译并运行,确保mydll.dll在同一目录下。


(完)