动态链接库:
创建一个动态链接库文件
创建完成后,会出现一个DllMain函数(参数:模块句柄,调用原因,保留)
这个函数在一下几种情况发生时会被调用
- 程序被创建
- 程序中有线程被创建
- 程序即将退出
- 程序中有线程将要退出
DllMain函数可以执行一些初始化或清理资源的操作
dll的导出方式有两种
声明导出
DLL.h
1 | #pragma once |
DLL.cpp
1 | // DLL.cpp : 定义 DLL 应用程序的导出函数。 |
重新生成后在Debug文件夹下见到dll了
使用PEID可以查看到导出表
def文件导出
新建文件DLL.def
DLL.def(;是备注)
1 | ;导出脚本 |
DLL.cpp
1 | // DLL.cpp : 定义 DLL 应用程序的导出函数。 |
然后右键项目属性,链接器->输入->模块定义文件修改为刚创建的def文件
重新生成后再拖到PEID中查看
也可以查看到导出的函数
现在已经制作好了dll文件,那么如何才能够使用它呢?有两种方式可以使用dll文件
隐式链接
- 包含头文件
- 载入lib文件
- 调用函数
新建一个控制台项目
1 | #include "..\\DLL\\DLL.h"//相对路径绝对路径都可以 |
注意:生成的DLL.h和DLL.lib不在同一个文件夹下
显式链接
1 | #include <Windows.h> |
使用PEID查看隐式链接和显式链接的输入表
隐式链接会暴露dll的调用信息
显式链接则不会暴露dll的信息
静态链接库
动态链接库在发布时需要跟着exe文件一起发布出去,但是如果想要只发布exe文件程序就可以运行,可以使用静态链接库
项目右键属性->常规->配置类型 修改为静态库
编译后只会生成一个lib文件和一个pdb文件
编译运行Main项目,程序就可以在任意位置运行了
编译动态链接库的时候生成了一个dll文件和一个lib文件
编译静态链接库的时候生成了一个lib文件
静态链接库的lib文件,称为对象库。其中包含了数据和代码
动态链接库的lib文件,称为导入库,其中不包含数据和代码,仅包含一些链接信息
对象库:161KB
导入库:2KB