欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3.利用Win32 API调用DLL

程序员文章站 2022-07-05 12:54:40
...

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.利用Win32 API调用DLL

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;
}

执行结果:

3.利用Win32 API调用DLL

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