纯动态链接库(非MFC动态链接库)的建立与使用

动态链接库的创建

以四则运算建立动态链接库为例:

  1. 新建动态链接库,在工程目录下选择Win32 Dynamic-Link Library,输入工程名make_Dynamic_Link_Library,选择工程位置。
  2. 确定后点击完成进入项目。
  3. 进入工程后新建源文件make_Dynamic_Link_Library.cpp与头文件make_Dynamic_Link_Library.h。
  4. 头文件中对四则运算函数名声明:
    – 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);
*******************************/
  1. 源文件中实现四则运算的具体实现:
    – 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;
}
  1. make_Dynamic_Link_Library.def中为:
LIBRARY "make_Dynamic_Link_library"
EXPORTS
	add @1
	sub @2
	mul @3
	div @4
  1. 组建-全部重建
    工程所在目录下的make_Dynamic_Link_library.h文件与Release文件夹或Debug文件夹下的make_Dynamic_Link_library.lib与make_Dynamic_Link_library.dll即为所需要的文件。

动态链接库的使用

隐式调用

  1. 在文件目录下选择C++ Source File,输入文件名use_Dynamic_Link_Library,选择文件保存位置。
  2. 将上面生成的make_Dynamic_Link_library.h、make_Dynamic_Link_library.lib与make_Dynamic_Link_library.dll放到use_Dynamic_Link_Library.cpp同级目录下。
  3. 在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;
}

即可成功使用动态链接库。

显示调用

  1. 在文件目录下选择C++ Source File,输入文件名use_Dynamic_Link_Library,选择文件保存位置。
  2. 将上面生成的make_Dynamic_Link_library.dll放到use_Dynamic_Link_Library.cpp同级目录下。
  3. 在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);	//释放动态链接库
}

即可成功使用动态链接库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值