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

感谢您的查阅!

 

posted @ 2020-10-26 17:26  大笨瓜  阅读(663)  评论(0)    收藏  举报