动态链接库的创建
以四则运算建立动态链接库为例:
- 新建动态链接库,在工程目录下选择Win32 Dynamic-Link Library,输入工程名make_Dynamic_Link_Library,选择工程位置。
- 确定后点击完成进入项目。
- 进入工程后新建源文件make_Dynamic_Link_Library.cpp与头文件make_Dynamic_Link_Library.h。
- 头文件中对四则运算函数名声明:
– make_Dynamic_Link_Library.h –
// 组建后没有.lib文件,说明库中的接口都相当于类的私有成员
double add(double, double);
double sub(double, double);
double mul(double, double);
double div(double, double);
// // 方案一:在接口中导出__declspec(dllexport)
// double __declspec(dllexport)add(double, double);
// double __declspec(dllexport)sub(double, double);
// double __declspec(dllexport)mul(double, double);
// double __declspec(dllexport)div(double, double);
/*****************************
方案二:通过.def文件给出接口
“文件-新建-文本文件”输入文件名make_Dynamic_Link_Library.def
在make_Dynamic_Link_Library.def文件中输入:
LIBRARY "make_Dynamic_Link_Library"
EXPORTS
add @1
sub @2
mul @3
div @4
@1、@2、@3、@4代表在后面是使用中可以不使用函数名而用代号1、2、3、4
此时本文件中便可使用以下即可
double add(double, double);
double sub(double, double);
double mul(double, double);
double div(double, double);
*******************************/
- 源文件中实现四则运算的具体实现:
– make_Dynamic_Link_Library.cpp –
#include "make_Dynamic_Link_Library.h"
#include "math.h"
double add(double a, double b)
{
return a + b;
}
double sub(double a, double b)
{
return a - b;
}
double mul(double a, double b)
{
return a * b;
}
double div(double a, double b)
{
if(fabs(b) < 0.000001)
return 0;
else
return a / b;
}
- make_Dynamic_Link_Library.def中为:
LIBRARY "make_Dynamic_Link_library"
EXPORTS
add @1
sub @2
mul @3
div @4
- 组建-全部重建
工程所在目录下的make_Dynamic_Link_library.h文件与Release文件夹或Debug文件夹下的make_Dynamic_Link_library.lib与make_Dynamic_Link_library.dll即为所需要的文件。
动态链接库的使用
隐式调用
- 在文件目录下选择C++ Source File,输入文件名use_Dynamic_Link_Library,选择文件保存位置。
- 将上面生成的make_Dynamic_Link_library.h、make_Dynamic_Link_library.lib与make_Dynamic_Link_library.dll放到use_Dynamic_Link_Library.cpp同级目录下。
- 在use_Dynamic_Link_Library.cpp中输入:
#include <iostream.h>
#include "make_Dynamic_Link_Library.h"
#pragma comment(lib, "make_Dynamic_Link_Library.lib")
void main()
{
cout << "1 + 2 =" << add(1, 2) << endl;
cout << "1 - 2 =" << sub(1, 2) << endl;
cout << "1 * 2 =" << mul(1, 2) << endl;
// cout << "1 / 2 =" << div(1, 2) << endl;
}
即可成功使用动态链接库。
显示调用
- 在文件目录下选择C++ Source File,输入文件名use_Dynamic_Link_Library,选择文件保存位置。
- 将上面生成的make_Dynamic_Link_library.dll放到use_Dynamic_Link_Library.cpp同级目录下。
- 在use_Dynamic_Link_Library.cpp中输入:
#include "iostream.h"
#include "windows.h"
void main()
{
HMODULE hinst = NULL;
hinst = LoadLibrary("make_Dynamic_Link_Library.dll"); // 加载库,得到动态链接库的句柄
if (hinst == NULL) // 加载失败
{
MessageBox(NULL, "动态链接库加载失败!", "提示", 1);
return;
}
// typedef double(*AddFunc)(double a, double b); // 定义函数指针类型(方法一)
typedef double (*ADDPROC)(double a,double b); // 定义函数指针类型(方法二)
// 导出函数地址
// AddFunc add = (AddFunc)GetProcAddress(hinst, "add"); // GetProcAddress返回指向的函数名的函数地址
ADDPROC add = (ADDPROC)GetProcAddress(hinst, "add");
if(!add)
{
cout << "获得add函数地址失败!" << endl;
return;
}
// AddFunc sub = (AddFunc)GetProcAddress(hinst, "sub");
ADDPROC sub = (ADDPROC)GetProcAddress(hinst, "sub");
if(!sub)
{
cout << "获得sub函数地址失败!" << endl;
return;
}
// AddFunc mul = (AddFunc)GetProcAddress(hinst, "mul");
ADDPROC mul = (ADDPROC)GetProcAddress(hinst, "mul");
if(!mul)
{
cout << "获得mul函数地址失败!" << endl;
return;
}
// AddFunc div = (AddFunc)GetProcAddress(hinst, "div");
ADDPROC div = (ADDPROC)GetProcAddress(hinst, "div");
if(!div)
{
cout << "获得div函数地址失败!" << endl;
return;
}
cout << "1 + 2 = " << add(1, 2) << endl;
cout << "1 - 2 = " << sub(1, 2) << endl;
cout << "1 * 2 = " << mul(1, 2) << endl;
cout << "1 / 2 = " << div(1, 2) << endl; // 计算错误原因:VC++6.0内部已有div函数,对该函数重新命名即可解决此问题
FreeLibrary(hinst); //释放动态链接库
}
即可成功使用动态链接库。