动态链接库(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文件所在的目录下
作者:王韩六六
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.