看了很多关于DLL的文章,感觉还是说的不够浅显,这里记录下我的一个了解过程
这里我只用最简单粗暴的方式去使用DLL
文章参考了:参考:https://msdn.microsoft.com/zh-cn/library/ms235636.aspx
开发环境:VS2017
首先创建一个DLL的工程,这里我的工程名为MyDll
文件 -》新建 -》项目-》Visual C++ -》Windows桌面-》动态链接库(DLL)
写入项目名称MyDll 然后就生成了一个工程 包含dllmain.cpp 还有其他的文件(这些都不重要)
类向导 新增加一个类 将你需要实现的功能写在对应的文件中就OK
创建了一个类 叫做MathFuncsLib 包含两个文件 MathFuncsLib.h,MathFuncsLib.cpp
代码如下 MathFuncsLib.h
#pragma once
#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport)
#else
#define MATHFUNCSDLL_API __declspec(dllimport)
#endif
namespace MathFuncs
{
class MathFuncsLib
{
public:
// Returns a + b
static MATHFUNCSDLL_API double Add(double a, double b);
// Returns a - b
static MATHFUNCSDLL_API double Subtract(double a, double b);
// Returns a * b
static MATHFUNCSDLL_API double Multiply(double a, double b);
// Returns a / b
// Throws const std::invalid_argument& if b is 0
static MATHFUNCSDLL_API double Divide(double a, double b);
};
}
MathFuncsLib.cpp
#include "stdafx.h"
#include "MathFuncsLib.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MathFuncsLib::Add(double a, double b)
{
return a + b;
}
double MathFuncsLib::Subtract(double a, double b)
{
return a - b;
}
double MathFuncsLib::Multiply(double a, double b)
{
return a * b;
}
double MathFuncsLib::Divide(double a, double b)
{
if (b == 0)
{
throw invalid_argument("b cannot be zero!");
}
return a / b;
}
}
就包含这两个文件 其他的都不需要你做任何修改,F7编译一下 就会在对应的目录(Debug/Release)下面生成MyDll.dll 和 MyDll.lib 有了这两个文件 然后再加上 你上面的.h文件 就可以拿过来进行一个使用
第二步:来测试刚刚生成的DLL文件
建立工程:
文件 -》新建 -》项目-》Visual C++ -》常规-》空工程
这里我们取名叫做TestDll
进行一个设置:
设置路径: 目录下包含dll文件和lib文件
引用目录:$(SolutionDir)$(Configuration) (放在debug或者release下面)
库目录:$(SolutionDir)$(Configuration)
链接器-》输入-》附加依赖项 MyDll.lib
包含文件中的 .h文件 然后进行编译
注意:Release下的dll文件生成比debug下的dll文件要小
测试代码如下
/*
2018-8-27 17:36:32
测试生成的DLL
*/
#include <iostream>
#include "MathFuncsLib.h"
using namespace std;
int main()
{
double a = 7.4;
int b = 99;
cout << "a + b = " <<
MathFuncs::MathFuncsLib::Add(a, b) << endl;
cout << "a - b = " <<
MathFuncs::MathFuncsLib::Subtract(a, b) << endl;
cout << "a * b = " <<
MathFuncs::MathFuncsLib::Multiply(a, b) << endl;
cout << "a / b = " <<
MathFuncs::MathFuncsLib::Divide(a, b) << endl;
try
{
cout << "a / 0 = " <<
MathFuncs::MathFuncsLib::Divide(a, 0) << endl;
}
catch (const invalid_argument &e)
{
cout << "Caught exception: " << e.what() << endl;
}
system("pause");
return EXIT_SUCCESS;
}
生成结果:
a + b = 106.4
a - b = -91.6
a * b = 732.6
a / b = 0.0747475
Caught exception: b cannot be zero!
请按任意键继续. . .
特别需要注意的点:
这里需要注意包含的文件路径:debug就包含在Debug文件夹下;Release就包含在Release的路径下
Debug和Release的版本是不一样的 对应生成的DLL也要选择对应的方式生成;然后包含在需要用到的工程的Debug或者Release路径下
设置:项目 =》 属性 -》引用目录 $(SolutionDir)$(Configuration)
项目 =》 属性 -》库目录 $(SolutionDir)$(Configuration)
链接器-》输入-》附加依赖项 MyDll.lib