QLibrary:加载动态库

文章讲述了如何使用QLibrary在C++中解析Winmm.dll等C语言编写的动态链接库,通过typedef和QLibrary::resolve函数获取并调用库中的函数。同时介绍了显式链接和隐式链接的区别,以及QLibrary类的使用方法和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一篇

参考原文链接:https://blog.csdn.net/HHT0506/article/details/116155724

背景
项目中需要对操纵手柄进行读取,在网上找了几篇博客,基本都是依赖winmm.lib,但其中一篇直接加载它的动态库,从里面把函数解析出来,虽然麻烦,但还是眼前一亮,竟然可以这么做!!!

由于不太熟悉typedef的这种操作,一开始没看懂,后来查了下,这是使用typedef定义的函数指针,并简单整理了这篇文章。

分析
以解析的第一个函数为例

QLibrary mylib("Winmm.dll");
typedef int (*MyPrototype) (HWND, UINT, UINT, BOOL);
MyPrototype qJoySetCapture = (MyPrototype)mylib.resolve("joySetCapture");

第一条语句是:定义一个库对象mylib,将目标dll加载进来;
第二条语句是:定义了一个函数指针类型,该类型定义的指针可指向返回值为int类型、函数参数为(HWND,UINT,UINT,BOOL)的函数;
第三条语句是:定义了一个函数指针qJoySetCapture。resolve函数中的joySetCapture是dll中的函数名,通过resolve进行解析,resolve返回的是该函数“joySetCapture”的地址,通过强制类型转化,再让qJoySetCapture指向该地址。

Example:

typedef int (*AvgFunction)(int, int);

AvgFunction avg = (AvgFunction) library->resolve("avg");
if (avg)
    return avg(5, 8);
else
    return -1;

The symbol must be exported as a C function from the library. This means that the function must be wrapped in an extern “C” if the library is compiled with a C++ compiler. On Windows you must also explicitly export the function from the DLL using the __declspec(dllexport) compiler directive, for example:

extern "C" __declspec(dllexport) int avg(int a, int b)
{
    return (a + b) / 2;
}


总结
一般只有对某个dll非常熟悉,知道dll中包含哪些函数、函数参数个数及类型、返回值类型才使用这种方式加载并调用函数,否则,还是使用头文件+lib的方式调用函数。
另外,可以使用Dependency Walker查看dll中的函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值