加载
- 双击.exe的时候,该.exe被加载到内存当中,形成一个进程
- 在这个过程中,DLL也会被加载到内存中
- DLL被加载后处于被占用的状态,不能对它进行修改删除等操作
- DLL被卸载后,可以对它进行操作
- 对于占用同一个DLL的不同进程,不可比较DLL中变量的地址,因为DLL数据段每个进程都会拷贝一份,所以该地址会是虚拟地址
内容
DLL文件中,至少分为两个段
- 代码段
- 存储指令(函数体)
- 数据段
- 存放全局变量
- 注意的地方
- .dll被加载时,代码段只被加载一次,是公共的
- 而数据段会被每个程序都拷贝一份,是私有的,即各进程间不受影响
内存
- 在DLL里使用malloc分配的内存,应该使用DLL中提供的free方法来释放
头文件
- DLL应该附带一份头文件,使用者根据头文件中的相应声明来规范使用
- 设计原则
- 在DLL项目中,需要将函数声明为
_declspec(dllexport)
- 在APP项目中,需要将函数声明为
_declspec(dllimport)
- 在DLL项目中,需要将函数声明为
- 实现方法
- 条件编译指令
- 实例代码
- DLL mydll.h
1234567891011#ifndef _MYDLL_H#define _MYDLL_H#ifndef MYDLL_EXPORT#define MYDLL _declspec(dllexport)#else#define MYDLL _declspec(dllimport)#endif//DLL函数声明MYDLL int Add(int a,int b);//DLL函数声明#endif - DLL mydll.cpp
123456#define MYDLL_EXPORT#include "mydll.h"int Add(int a,int b){return a+b;} - 编出DLL
- APP main.cpp(在使用到DLL的APP里面)
12345678910#include <iostream>#include "mydll.h"#pragma comment(lib,"my.lib")using namespace std;int main(){int result = Add(1,2);cout << result << endl;return 0;} - DLL中导出类
- 导出类的定义,其实就是导出类的成员函数
- DLL mydll.h
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 静态库10/02
- ♥ 静态库03/15
- ♥ Windows Dll自卸载相关10/19
- ♥ 运行库选项10/02
- ♥ 排序_堆排序05/08
- ♥ Docker记述一08/18