C++编写一个继承类,封装为DLL并隐式调用

一. 什么是DLL(动态链接库)?

动态链接库(dynamic-link library)(DLL) 是一个包含函数和数据的模块,它可以被其他模块(应用或 DLL)使用。使用 DLL 也有助于减少内存占用,因为即便每个程序需要拥有属于自己的 DLL 数据的副本,这些程序共享了 DLL 的代码。

二. 如何创建DLL?

2.1 新建dll项目

在这里插入图片描述

2.2 代码编写

代码内容引用 https://blog.csdn.net/qq_34097715/article/details/79540933?spm=1001.2014.3001.5506

2.1 创建DLL.h和DLL.cpp

在这里插入图片描述

2.2 DLL.h代码编写

测试 隐式调用不需要extern “C” 也可以成功 ,显示调用就需要,否则GetProcAddress获取函数失败,原因为,经过编译器编译后,采用_declspec调用约定对应的函数名修饰规则,对函数名进行了修饰。还没理解透,先跑起来再说。

#pragma once
#ifdef CREATEDELL_API_DU     //#ifdef 判断某个宏是否被定义,若已定义,执行随后的语句
#else                        //相当于else                                           
#define CREATEDELL_API_DU _declspec(dllimport) //当编译时,头文件不参加编译,所以.cpp文件中先定义,后头文件被包含进来,因此外部使用时,为dllexport,而在内部编译时,则为dllimport
#endif                                         

class CREATEDELL_API_DU animal              //需要被外界调用的类(父类)
{
public:
	virtual int outDate() = 0;                 //纯虚函数
	void getWide(int x);
	void getHigh(int y);

protected:
	int wide;
	int high;
};


class CREATEDELL_API_DU cat :public animal      //需要被调用的类(子类cat)
{
public:
	int outDate();
};


class  CREATEDELL_API_DU dog :public animal     //需要被调用的类(子类dog)
{
public:
	int outDate();
};

int CREATEDELL_API_DU exportDate();             //需要被调用的函数(单独的一个函数,不属于任何一个类)

2.2 DLL.cpp代码编写

#include"pch.h"    //预编译头文件
#define CREATEDELL_API_DU _declspec(dllexport)

#include <iostream>
#include"DLL.h"
using namespace std;
//父类中函数实现 
void animal::getWide(int x) {
	wide = x;
}
void CREATEDELL_API_DU animal::getHigh(int y) {
	high = y;
}//子类cat中数据输出实现
int CREATEDELL_API_DU cat::outDate() {
	return (wide + high); wide += wide; high += high;
}//子类dog数据输出实现
int CREATEDELL_API_DU dog::outDate() {
	return (wide - high);
}//函数的实现
int CREATEDELL_API_DU exportDate() {
	return 666;
}

2.3 DLL的生成

在这里点击运行会报错!!!!!需要点击生成解决方案.这里就已经创建好DLL了。

在这里插入图片描述

2.4 查看生成的文件

Debug文件夹下即为生成的DLL.dll及DLL.lib。

在这里插入图片描述

DLL文件夹里即为项目文件.

在这里插入图片描述

三. 如何调用DLL?

3.1 DLL调用方法

DLL调用分为隐式链接(需要.lib 和.dll)显式链接(需要#include <windows.h> 和 .dll)。这篇文章讲隐式链接。下一篇文章讲显示链接。

区别:隐式链接就是在程序开始执行时就将DLL文件加载到内存当中,而显示链接,是实时加载,程序需要的时候加载,不需要的时候,卸载。

3.2 DLL隐式链接

隐式链接,也称为静态加载,是在编译时确定DLL函数地址的过程。这要求DLL在编译时可用,并且链接器会查找所有外部符号引用。这种方式需要DLL文件,以及相应的Lib文件和头文件。

  1. 创建新项目用于调用DLL,这里创建了Invoke项目,并添加main.cpp。
    在这里插入图片描述

  2. 用户引用的时候尽量和导出时的DLL平台一致(X86/X64)。
    包含目录:添加.h所在的文件夹
    库目录:添加.lib所在的文件夹
    链接器->输入->附加依赖项 中添加Dll.lib 或者输入 #pragma comment(lib,“Dll.lib”)
    在这里插入图片描述
    在这里插入图片描述

  3. main.cpp添加代码,运行会报错,继续往下看第4步。

#include<iostream>
#include"DLL.h"
using namespace std;
bool main()
{
	cout << exportDate() << endl;          //调用函数输出666   
	dog dog;     //实例化dog对象、赋值、并输出。
	dog.getHigh(5);
	dog.getWide(6);
	cout << dog.outDate() << endl;

	cat cat;    //实例化cat对象、赋值、并输出
	cat.getHigh(16);
	cat.getWide(4);
	cout << cat.outDate() << endl;
	getchar();          //让程序处于等待输入状态下,而不是一闪而过
	return 0;
}
  1. 将Dll.lib放入Invoke项目的Debug目录下。
    在这里插入图片描述
  2. 执行结果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值