3.利用Win32 API调用DLL

DLL文件的调用有两种方式,第一种方式就是利用.h、.lib和.dll三个文件在项目中调用动态链接库,还有一种方式就是利用Win32的API来对动态链接库进行调用

1.利用.h,.lib,.dll实现动态链接库的调用

1)编译的时候需要.h文件和.lib文件,运行的时候需要.dll文件

.h文件:头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件

.lib文件:引入库文件,包含被DLL导出的函数的名称和位置,在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的地址,这样当一个或多个应用程序运行时再把程序代码和被调用的函数代码链接起来,从而节省了内存资源

.dll:包含实际的函数和数据, 发布时只需要有.exe文件和.dll文件,并不需要.lib文件和.h头文件

这种调用方式可以参考我的上一遍博客:动态链接库的生成和使用

 

2.利用Win32的API调用动态链接库

2.1 三个重要函数:

1)LoadLibrary()---加载DLL函数

HMODULE WINAPI LoadLirary(_In_LPCWSTR IpLibFileName);

参数:IpLibFileName -》动态链接库的名称

返回值:成功则返回库模块的句柄,失败返回0,通过GetLastError()返回错误码

2)GetProcAddress()---获取函数地址

FARPROC WINAPI GetProcAddress(HMODULE hModule, LPCSTR IpProcName);

参数:hModule:DLL模块句柄;IpProcName:函数名或一个WORD序数值(高字节为0,低字节为序号),例如:

GetProcAddress(h, (char*)(3));

 返回值:调用成功返回值是DLL中的输出函数的地址;失败返回NULL,通过GetLastError()返回错误码

*函数的名称和序号可以通过Dependency Walk中查看

3)FreeLibrary()---释放DLL

BOOL WINAPI FreeLibrary(_In_HMODULE hLibModule);

参数:hLibModule:模块句柄

返回值:成功则返回非0,失败返回0,通过GetLastError()返回错误码

2.2代码实现

1)添加头文件

#include <windows.h>

2)在Dependency中查看函数名称和序号

3)编写代码:

#include <iostream>
#include <windows.h>
using namespace std;
//#include "func.h"
//不需要.h头文件和.lib文件
//#pragma comment(lib,"DynamicLib64.lib")

int main()
{
	int a = 34;
	int b = 32;

	//加载DLL文件
	HMODULE h = LoadLibrary("DynamicLib32.dll");
	//定义一个函数指针类型
	typedef int(*PFUNC)(int, int);
	//通过函数名称来获取函数地址
	//PFUNC pSquareSum = (PFUNC)GetProcAddress(h, "SquareSum");
	//PFUNC pSumSquare = (PFUNC)GetProcAddress(h, "SumSquare");
	//通过函数序号来获取函数地址
	PFUNC pSquareSum = (PFUNC)GetProcAddress(h, (char*)1);
	PFUNC pSumSquare = (PFUNC)GetProcAddress(h, (char*)2);
	//调用函数
	cout << pSquareSum(a, b) << endl;
	cout << pSumSquare(a, b) << endl;
	//释放DLL文件
	FreeLibrary(h);

	system("pause");
	return 0;
}

执行结果:

注意,这种调用动态库的方式不需要.h头文件和.lib文件,也不需要在项目的属性中添加.lib文件

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深山里的小白羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值