隐式链接使用DLL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include <stdio.h>
#pragma comment(lib, "Dll1.lib")
#ifdef __cplusplus extern "C" { #endif
__declspec(dllimport) int __stdcall Plus(int x, int y); __declspec(dllimport) int __stdcall Sub(int x, int y);
#ifdef __cplusplus } #endif
int main() { int a = Plus(10, 20); int b = Sub(30, 15);
printf("Plus(10, 20) = %d\n", a); printf("Sub(30, 15) = %d\n", b);
return 0; }
|
DLL的优点
1. 节省内存
多个程序可以共享同一个 DLL。 系统只需要把 DLL 加载到内存一次,所有调用它的进程都可以使用同一份代码,减少内存占用。
2. 减小可执行文件体积
常用功能(比如数学运算、界面控件、网络通信等)放在 DLL 里,主程序(.exe)就不需要包含这些代码,文件更小。
3. 方便更新和维护(热更新)
只需要替换 DLL 文件,不用重新编译主程序,就能升级功能或修复 Bug。 很多软件(游戏、工具)都通过更新 DLL 实现小版本升级。
4. 代码复用
一次编写,多个项目都能用。 例如你写了一个数学计算 DLL,以后所有需要这些功能的程序都可以直接链接它。
5. 支持插件架构
程序可以在运行时动态加载不同的 DLL,实现插件功能。 很多软件的扩展、皮肤、功能模块都是靠 DLL 实现的。
6. 模块化开发
把大型项目拆分成多个独立模块(不同的 DLL),不同团队可以并行开发,降低耦合度,方便管理。
7. 隐藏实现细节
只暴露接口(函数声明),具体实现代码在 DLL 里,别人看不到源码,有一定的保护作用。
DllMain函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: OutputDebugStringA("DLL_PROCESS_ATTACH\n"); break; case DLL_THREAD_ATTACH: OutputDebugStringA("DLL_THREAD_ATTACH\n"); break; case DLL_THREAD_DETACH: OutputDebugStringA("DLL_THREAD_DETACH\n"); break; case DLL_PROCESS_DETACH: OutputDebugStringA("DLL_PROCESS_DETACH\n"); break; } return TRUE; }
|