文章目录
使用库是重复使用代码的一种方式,不用在创建的每个程序中重新实现相同的例程,一次性编写,然后从需要该功能的应用中引用它们。通过将代码置于DLL,可以节省引用它的每个应用中的空间,也可以更新该DLL而无需重新编译所有应用。
-
创建动态链接库(DLL)项目
-
向动态链接库添加类
-
创建应用DLL的应用
-
在该应用中使用类库中的功能
-
UML序列图和流程图
-
运行应用程序
#创建动态链接库(DLL)项目
#向动态链接库添加类
##添加MathFuncsDll.h
// MathFuncsDll.h
#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport)
#else
#define MATHFUNCSDLL_API __declspec(dllimport)
#endif
namespace MathFuncs
{
// This class is exported from the MathFuncsDll.dll
class MyMathFuncs
{
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);
};
}
在此代码中,当MATHFUNCSDLL_EXPORTS符号已经被定义时,成员函数声明部分的MATHFUNCSDLL_API符号将被设置为_declspec(dllexport)修饰符。词修饰符使函数能作为DLL导出,以供其他应用程序调用。如果未定义MATHFUNCSDLL_EXPORTS(例如,应用程序包含了头文件),则MATHFUNCSDLL_API将定义成员函数声明中的_declspec(dllimport)修饰符。此修饰符将优化在应用程序中导入该函数的操作。默认情况下,DLL的新建项目模板会将PROJECTNAME_EXPORTS添加到DLL项目的已定义符号中。在例子中,生成MathFuncsDll项目后将定义MATHFUNCSDLL_EXPORTS。
##添加MathFuncsDll.cpp源文件
// MathFuncsDll.cpp : Defines the exported functions for the DLL application.
//
#include "MathFuncsDll.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
if (b == 0) {
throw invalid_argument("b cannot be zero!");
}
return a / b;
}
}
#创建应用DLL的应用
创建win32应用程序,并添加源码
// MyExecRefsDll.cpp : 定义控制台应用程序的入口点。
//
// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib
#include <iostream>
#include "MathFuncsDll.h"
using namespace std;
int main()
{
double a = 7.4;
int b = 99;
cout << "a + b = " <<
MathFuncs::MyMathFuncs::Add(a, b) << endl;
cout << "a - b = " <<
MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
cout << "a * b = " <<
MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
cout << "a / b = " <<
MathFuncs::MyMathFuncs::Divide(a, b) << endl;
try {
cout << "a / 0 = " <<
MathFuncs::MyMathFuncs::Divide(a, 0) << endl;
}
catch (const invalid_argument &e) {
cout << "Caught exception: " << e.what() << endl;
}
system("pause");
return 0;
}
#在该应用中使用类库中的功能
##添加引用
##包含头文件
#运行应用程序
#参考目录
演练:创建和使用动态链接库(C++)