C++ DLL的创建
首先安装VS2019,打开后选择创建新的项目
新建以下项目:

选择一个名字:

然后点击创建,这样一个动态链接库的项目就完成了。
首先介绍以下文件:

这个就是DLL的入口函数,也叫main函数。
下面简单介绍以下DLL,DLL呢是Windows上的程序扩展文件,DLL内部就是封装了cpp的源代码
我们根据编译器创建的项目文件开始dll的编写。
我们打开pch.h头文件,没有的自己新建一个
编写以下代码
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include<windows.h>
#ifdef DLL_HONG
__declspec(dllexport) int Add(int a, int b);
__declspec(dllexport) int Max(int a, int b);
#else
__declspec(dllimport) int Add(int a, int b);
__declspec(dllimport) int Max(int a, int b);
#endif // DLL_HONG
#endif //PCH_H
解释一下这段代码的含义:__declspec(dllexport)这个是dll的导出关键字,固定写法,意思是如果定义了宏DLL_HONG,那么函数int Add(int a, int b);定义为导出模式,也就是说,DLL项目开发模式
__declspec(dllimport)是导入的关键字,如果没有定义DLL_HONG宏,那么函数 int Add(int a, int b);定义为导入模式,也就是实际项目开发模式,
头文件里面的函数是函数声明。
然后我们在pch.cpp编写以下代码:
#define DLL_HONG
#include "pch.h"
int Add(int a, int b) {
return a + b;
}
int Max(int a, int b) {
if (a > b) {
return a;
}
else {
return b;
}
}
注意宏要定义在头文件上面。
这样,我们在写dll项目的时候,因为cpp文件定义了宏,所以函数处于导出模式,但是一旦封装之后,cpp文件将不再使用,转而使用的是头文件,lib文件,dll文件
我们把需要编写的函数实现在pch.cpp里,然后再在.h文件里面声明它,通过宏定义来控制函数的导入导出。
编写完需要实现的功能后,我们点“生成解决方案”。
注意:
1.dll区分32位和64位,根据需要设定
2.代码生成修改为MTD或者MT格式
3.取消预编译头,这个主要防止在多次点击生成解决方案导致,编译器预编译忽略问题。
4.dll动态申请内存,只能在本dll内释放,或者编写释放函数接口
使用的时候,#include头文件。#pragma comment (lib,"MyDLL.lib")文件,将DLL和lib文件拷贝到程序所在的目录下,这里不好搞错了,项目开发时是在项目文件,程序发布时是在程序所在文件。
下面讲几个特殊的情况:
一。如果不使用头文件,怎么使用dll,
如果刚开始就打算不使用头文件,那么cpp在编写函数实现的时候,就需要在函数的头部加入__declspec(dllexport)
如以下函数:
__declspec(dllexport) int Add(int a, int b) {
return a + b;
}
在使用的时候,除了加载使用#pragma comment 加载lib文件外,还需要声明函数
__declspec(dllimport) int Add(int a, int b);
声明这个函数是从dll导入的。
二。还有一种情况就是只有dll。什么也没有,这个在编写的时候,除了上面第一种的写法们还需要加入一个声明,extern “C”说明将函数声明为一个C函数,
然后使用Windows API函数LoadLibrary查找函数,以供使用,这种方式比较麻烦,当然对文件结构要求也低,因为只有一个dll文件,
三。说一下class的导出。
class的导入导出和函数差不多,需要在class 后面,类名前面加入导入导出的关键字,然后声明,class的函数,这些函数只需要声明,不需要写导入导出,因为class已经声明了,
如果没有头文件时,class编写时添加导出关键字,使用dll时,声明class导入关键字,
只有一个dll时,也是通过类名范围符指定函数名查找:
下面是一位大佬写的详细教程,
http://www.cppblog.com/codejie/archive/2009/09/24/97141.html
感谢您的查阅!

浙公网安备 33010602011771号