使用QLibrary加载动态库

【跟我每天学习1个QT类】QLibrary类 — 加载管理动态链接库的类 定义了加载库可能出现的错误类型,如NotFoundLoadError等。:定义了加载库时的提示选项,如等。:定义了LoadHints作为LoadHint枚举值的集合,用于一次性设置多个加载提示。需要注意的是,实际使用中应结合Qt的文档和版本信息来确认上述成员及函数的具体行为,因为随着Qt版本的更新,某些细节可能会有所变化。同时,对于QLibrary的高级使用,如处理特定平台的特性或更复杂的插件场景,可能需要进一步了解其内部工作原理以及与之相关的Qt生态系统知识。 阅读详情

背景

项目中需要对操纵手柄进行读取,在网上找了几篇博客,基本都是依赖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进行解析,返回的是该函数的地址,通过强制类型转化,再让qJoySetCapture指向该地址。

resolve()函数

附上Qt官方解释
QLibrary::resolve(const char *symbol)

Returns the address of the exported symbol symbol. The library is loaded if necessary. The function returns nullptr if the symbol could not be resolved or if the library could not be loaded.

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中的函数
在这里插入图片描述
可以看到,winmm.dll是由C语言编写编译生成的,在dll中的符号就是函数名。

参考

Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库
使用QLibrary加载动态库

深入解析QLibrary:Qt动态库加载与符号解析实战指南 本文深入解析Qt框架中的QLibrary类,提供动态库加载与符号解析的实战指南。详细介绍了QLibrary的核心机制、跨平台加载策略、LoadHints性能优化、错误排查技巧以及如何通过工厂函数模式加载C++类对象,帮助开发者掌握运行时动态扩展应用的关键技术。 阅读详情

相关推荐

使用QLibrary类实现动态链接库加载

else#endif接着,在另一个Qt项目中使用QLibrary来加载该动态链接库并调用其中的函数:#include#include//定义函数指针类型int main()//加载动态链接库if (!myLib.load()) { //是否成功加载return 1;//获取函数指针if (add) { //调用函数} else {//卸载动态链接库return 0;

TechProX的博客 658

QT 使用QLibrary加载动态库

QT 使用QLibrary加载动态库

路过的熊的博客 3098

使用QT的QLibrary类进行动态链接库的加载和调用(C/C++)

在C/C++开发中,动态链接库(Dynamic Link Library,简称DLL)是一种常见的组件化编程的方式。以上就是使用QT的QLibrary类进行动态链接库的加载和调用的详细介绍和示例代码。通过QLibrary类,我们可以方便地在C/C++程序中加载和调用动态链接库,实现代码的模块化和重用。获取成功后,将执行注释中的代码块,否则将执行错误处理的代码块。加载成功后,将执行注释中的代码块,否则将执行错误处理的代码块。加载成功后,该函数将返回一个QLibrary对象,用于后续的操作。

TechWhiz的博客 1284

Qt文档阅读笔记-QLibrary基本概念及实例

QLibrary类是在程序运行时加载动态动态链接库的。 可以通过使用构造函数添加需要加载的链接库路径,或者使用setFileName()函数设置路径。如果是绝对路径就直接加载,如果是相对路径QLibrary会在相当路径及所有环境变量中寻找。 如果都找不到,会通过平台的不同,去加对应的.so或.dll文件。 这个意思就是,当在windows上加载lib库的参数为demo,那么QLibrary会在后面加.dll。如果是linux就会加.so。 通过调用load()函数加载链接库,...

IT1995的博客 3540

Python RPA 流程自动化快速上手

Python RPA 流程自动化快速上手

看花容易绣花难 1万+

【板栗糖GIS】新装ArcGIS必调的12个隐藏设置——【效率翻倍指南】

本文详细介绍了新装ArcGIS后必调的12个隐藏设置,涵盖性能优化、路径管理、显示调校、工作流定制等方面,帮助用户显著提升GIS工作效率。从关闭后台地理处理到启用硬件加速,再到个性化快捷键配置,这些实用技巧能让ArcGIS运行更流畅,操作更便捷。

weixin_42524945的博客 544

QLibrary 灵活加载动态库

在软件开发中,我们常会遇到这样的需求:希望在不重新编译主程序的情况下扩展功能,或者需要根据运行环境动态加载不同模块。这正是动态库(Dynamic Link Library, DLL / Shared Object, SO)大显身手的场景。qCritical() << "加载失败:""动态库加载失败");静态加载:程序启动时自动加载,占用内存多。// 原始方式(存在类型不安全风险)动态加载:运行时按需加载,节省资源。// 现代C++(编译期类型检查)// 使用类型安全的函数指针转换。

@ 1125

VisionPro实战:5个工业视觉检测案例详解(附代码片段)

本文详细解析了VisionPro在工业视觉检测中的5个实战案例,包括PCB焊点质量检测、汽车齿轮尺寸测量、药品包装缺陷检测等。通过硬件配置方案和软件算法流程的详细介绍,帮助工程师快速掌握VisionPro的应用技巧,提升工业自动化检测效率。

weixin_29284657的博客 518

qlibrary加载linux动态库,QLibrary 加载动态库

阅读本文大概需要 6.6分钟一般情况下在没有头文件支持情况下,想要引入某个动态库,最好的办法就是使用「动态加载」的方法,在Qt中一般使用QLibyary来操作常用 apiQLibrary(const QString& fileName, QObject *parent = nullptr);QFunctionPointer resolve(const char *symbol);bool ...

weixin_39537977的博客 798

GPU加速的容器化AI开发:AnolisOS/CentOS8中的NVIDIA驱动与CUDA最佳实践

本文详细介绍了在AnolisOS/CentOS8系统中配置NVIDIA驱动与CUDA的最佳实践,涵盖驱动安装、CUDA工具链配置、容器运行时设置及性能优化等关键步骤。特别针对容器化AI开发场景,提供了GPU透传和资源管理的实用方案,帮助开发者构建高效的GPU加速开发环境。

weixin_27791839的博客 341

Golang实现企业级AI智能体安全合规自动化检测系统

需求:自动化解析欧盟AI法案、中国网络安全法、美国NIST框架等多国法规,提取具体合规要求并映射到企业技术实现。技术挑战法规文本非结构化,语义复杂,存在大量法律术语与技术术语交叉多语言支持(中文、英文、欧盟24种官方语言)法规动态更新(平均每季度更新2-3次)架构创新性:提出了"规则引擎+AI模型+实时监控"的混合架构,兼顾了合规要求的明确性与智能体行为的动态性。性能突破:通过Golang协程、多级缓存、数据库优化等技术,实现了12,800 req/s的高吞吐量和38ms的低延迟。准确性提升。

shao.bing的专栏 722

QLibrary 加载动态库

阅读本文大概需要 6.6分钟 一般情况下在没有头文件支持情况下,想要引入某个动态库,最好的办法就是使用「动态加载」的方法,在Qt中一般使用QLibyary来操作 常用 api QLibrary(const QString& fileName, QObject *parent = nullptr); QFunctionPointer resolve(const char *symbol); bool load(); bool unload(); bool isLoaded() const.

1+1=10 个人博客http://kevinlq.com/ 503

浙大数值分析lab2

最可怕的一道题,题目是这样的 Root of a Polynomial A polynomial of degree nnn has the common form as p(x)=cnxn+cn−1xn−1+⋯+c1x+c0p(x)=c_n x^n + c_{n-1} x^{n-1} + \cdots + c_1 x + c_0p(x)=c​n​​x​n​​+c​n−1​​x​

yao_zou的博客 4796

Qt在linux环境下调用动态库,pro工程文件加载库和QLibrary加载库两种方式

加载库 INCLUDEPATH += 库的头文件路径 LIBS += -L PATH -lLIB,PATH是so库所在路径,LIB是库的名字(-L是库路径,-l是库名字,例如库文件是libReceiptPrint.so,后面应添加-lReceiptPrint) collect2:ld returned 1 exit status解决方案:没有正确加载库,检测库路径,32位还是64位,库是debug版还是release版 INCLUDEPATH += /home/chw/HSCompany/HardWareT

weixin_40355471的博客 1万+

uniapp - 最新详细实现web-view网页与安卓苹果App端之间互相通信功能,苹果app/安卓app平台与内嵌webview组件内的网页进行相互传值,内置网页与app双向实时通信,详细示例代码

uni-app,Android安卓,苹果ios,app,内嵌webview,第三方H5网页,app和web-view通信传值,web-view引入的页面向App主应用传递数据,App端与webview端相互通信,App端和H5端webview之间的通信,uniapp实现webview和APP之间的传值通信,如何互相传递对象数据,数据传递了接收不到,web-view页面向app内发送消息,监听传递的参数,uni-app和web-view页面相互传参,报错怎么办,跨域,屏幕空白出错,数据交互,解决手机物理返回按

🏆 前端领域优质创作者 4741

基于R-CNN深度学习的生活垃圾检测与分类系统:数据集、模型和UI界面的完整实现

我们将使用一个公开的垃圾分类数据集来训练我们的模型。一个常见的数据集是TACO数据集(Trash Annotations in Context),该数据集包含多种垃圾类别,适用于垃圾分类任务。TACO数据集中的图像标注了垃圾的类别以及其在图像中的位置,适合用于目标检测任务。图片数据:每张图片中包含不同种类的垃圾。标签文件:每个图像有相应的标签文件,标注了图像中垃圾的类别、位置(通常为边界框坐标)等信息。dataset/images/image1.jpgimage2.jpg......其中,

YOLO 1102

Qt动态库加载之 QLibrary

一、使用Qt编译C动态库 // cbb_frame.pro TEMPLATE = lib #app CONFIG += console \ # static \ c++11 \ shared\ dll CONFIG -= app_bundle CONFIG -= qt CONFIG += no_debug_release # 不会生成debug 和 release 文件目录 DESTDIR

Mr.Sugarcane 4283

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

QLibrary:加载动态库

项目中需要对操纵手柄进行读取,在网上找了几篇博客,基本都是依赖winmm.lib,但其中一篇直接加载它的动态库,从里面把函数解析出来,虽然麻烦,但还是眼前一亮,竟然可以这么做!一般只有对某个dll非常熟悉,知道dll中包含哪些函数、函数参数个数及类型、返回值类型才使用这种方式加载并调用函数,否则,还是使用头文件+lib的方式调用函数。由于不太熟悉typedef的这种操作,一开始没看懂,后来查了下,这是使用typedef定义的函数指针,并简单整理了这篇文章。,通过resolve进行解析,resolve。

zxf347085420的博客 1580

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

QT动态加载动态库 QLibrary

1.将生成的dll文件和接口文件(interface.h)拷贝到测试工程.pro目录下,新建一个lib文件夹放进去。这里构建好之后,可以在bin目录下找到dll文件(linux下是.so文件),这个就是之后要用到的库文件。注意:构建的时候选择MinGW,那么测试工程也要选择MinGW。三、如果要在linux下测试,只需要拷贝对应的so文件即可。一、新建一个工程Demo,作为动态库工程。1.创建接口文件,供库工程和测试工程使用。2.创建要导出的类 Demo,并继承。2.在测试工程的.pro文件配置。

m0_49024067的博客 616

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

QLibrary* 加载动态库文件 (**)

QLibrary* 加载动态库文件

ken2232的博客 371

QLibrary实战:跨平台动态库加载与符号解析指南

本文详细介绍了如何使用Qt的QLibrary实现跨平台动态库加载与符号解析。从基础加载、符号解析到高级技巧如版本管理、性能优化,再到错误处理与实战案例,全面解析了QLibrary在Windows、Linux和macOS上的应用实践,帮助开发者高效处理动态库相关问题。

weixin_30607659的博客 503

深入解析QLibrary:动态库加载与跨平台函数调用的实战技巧

本文深入解析了Qt框架中的QLibrary类,详细介绍了动态库加载与跨平台函数调用的实战技巧。通过核心机制分析、显式与隐式链接对比、跨平台路径处理策略以及高级性能调优方法,帮助开发者高效实现插件系统和模块化架构。特别适合需要处理Windows、Linux和macOS多平台兼容性的Qt开发项目。

weixin_27024175的博客 334
上一篇: C++ typedef定义函数与函数指针
下一篇: C++ 虚函数表图解
HHT0506
博客等级 码龄9年 353粉丝 140原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

HHT0506

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

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

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

打赏作者

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

抵扣说明:

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

余额充值