动态链接库(Dll)

##### Dll学习笔记

一.新建Dll

1.解决方案 -> 添加新项目 -> 创建具有导出项的动态链接库(DLL)。这样会默认生产一个.h与.cpp文件

// .h文件
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLLDEMO2_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// DLLDEMO2_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef DLLDEMO2_EXPORTS
#define DLLDEMO2_API __declspec(dllexport)
#else
#define DLLDEMO2_API __declspec(dllimport)
#endif
// 导出类
class DLLDEMO2_API CDllDemo2 {
public:
	CDllDemo2(void);
	// TODO: 在此处添加方法。
};
// 导出变量
extern DLLDEMO2_API int nDllDemo2;
// 导出函数
DLLDEMO2_API int fnDllDemo2(void);




// .cpp文件
// DllDemo2.cpp : 定义 DLL 的导出函数。
#include "pch.h"
#include "framework.h"
#include "DllDemo2.h"
// 这是导出变量的一个示例
DLLDEMO2_API int nDllDemo2=0;
// 这是导出函数的一个示例。
DLLDEMO2_API int fnDllDemo2(void)
{
    return 0;
}
// 这是已导出类的构造函数。
CDllDemo2::CDllDemo2()
{
    return;
}
二.编写自定义类并导出

1.在.h文件中编写一个自定义类Stock

// 自定义导出类Stock
class DLLDEMO2_API Stock
{
private:
	string company;
	long shares;
	double shares_val;
	double total_val;
	void set_total_val() { total_val = shares * shares_val; };

public:
	void acquire(const string& co, long num, double price);
	void buy(long num, double price);
	void sell(long num, double price);
	void update(double price);
	void show();
};

2.在.h文件中实现这个类的方法

// 实现自定义导出类的方法
void Stock::acquire(const string& co, long num, double price)
{
	this->company = co;
	if (num < 0)
	{
		cout << "Number of shares can't be negative;" << endl;
		this->shares = 0;
	}
	else
	{
		this->shares = num;
		this->shares_val = price;
		set_total_val();
	}
}

void Stock::buy(long num, double price)
{
	if (num < 0)
	{
		cout << "Number of shares can't be negative;" << endl;
		this->shares = 0;
	}
	else
	{
		shares += num;
		shares_val = price;
		set_total_val();
	}
}

void Stock::sell(long num, double price)
{
	if (num < 0)
	{
		cout << "Number of shares can't be negative;" << endl;
		shares = 0;
	}
	else if (num > shares)
	{
		cout << "Than you shares;" << endl;
	}
	else
	{
		shares -= num;
		shares_val = price;
		set_total_val();
	}

}

void Stock::update(double price)
{
	shares_val = price;
	set_total_val();
}

void Stock::show()
{
	ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield);
	streamsize prec = cout.precision(3);

	cout << "company:" << company << endl;
	cout << "shares:" << shares << endl;
	cout << "price:" << shares_val << endl;
	cout << "total_val:" << total_val << endl;
}

3.编译生成,则工程的debug目录下就生成了.dll和.lib文件

若debug路径下没有生成:则是因为有多个解决方案生成到其它项目的debug文件夹下。

(1)设置dll输出路径:右键项目的"属性"->连接器->常规->输出文件,添加自己想要的.dll文件的输出路径;

(2)设置lib输出路径:右键项目的"属性"->连接器->高级->导入库,添加自己想要的.lib文件的输出路径;

三.在其他项目中调用dll---静态调用

方法一:

1.创建新项目,对项目进行配置

(1)C/C++ -> 附加包含目录,添加包含dll.h所在的文件夹;

(2)链接器->常规->附加库目录,添加上面生成的.dll与.lib所在的文件夹;

(3)链接器->输入->附加依赖项,输入上面生成的dll.lib文件名。

2.在项目.cpp源文件,输入以下代码:

#include "DllDemo2.h"
#pragma comment(lib, "../DllDemo2/Debug/DllDemo2.lib")

注:

若编译通过但执行失败,提示关于“找不到 **.dll,无法执行代码,重新安装程序可能会解决此问题“。

解决:将**.dll放入工程根目录下。

方法二:

将.h .lib .dll文件拷到项目路径下,其中.dll文件必须在exe文件所在的目录下。

#include"DllDemo2/DllDemo2.h"
#pragma comment(lib, "./DllDemo2.lib")
四.思考

1.目前我想将写的dll与lib文件单独放入一个文件夹,而后在项目中引用,但是会提示“找不到 **.dll,无法执行代码,重新安装程序可能会解决此问题”

(1)我不清楚这样的话.h文件是放在那里;

(2).dll必须放在exe文件所在的目录下

posted @ 2022-08-05 17:19  王韩六六  阅读(215)  评论(0编辑  收藏  举报