
Qt中DLL调用方法详解:全局函数、类成员函数及插件形式

标题中提到的“Qt 编程 DLL和DLL的3种常见调用方法”涉及到在Qt环境下如何使用动态链接库(DLL)。Qt提供了多种方式来加载和使用DLL中的功能,常见的调用方法主要包括使用QLibrary进行函数调用、使用COM接口方式调用以及使用QPluginLoader加载插件。下面详细讲解每种方法的知识点。
### DLL_CALL1:使用QLibrary调用DLL中的全局函数
- **QLibrary类**: QLibrary是Qt中用于动态加载和链接本地库的类。它封装了Windows的LoadLibrary和GetProcAddress函数以及其他平台上的相应功能,便于跨平台使用。
- **函数原型**: 在调用DLL中的全局函数前,必须事先知道该函数的原型,这样才能正确声明对应的函数指针,从而进行调用。
- **动态加载**: 使用QLibrary,可以在运行时动态加载DLL文件。这意味着DLL文件并不需要在编译时与可执行文件(.exe)一起链接,而是在程序运行时加载。
- **loadlibrary与getprocaddress**: QLibrary内部使用了loadlibrary和getprocaddress这两个API。loadlibrary用于加载DLL文件,而getprocaddress用于获取DLL内部函数的地址。
- **DLL位置**: DLL文件不必放置在可执行文件旁边,可以在程序指定的目录下,或者一些系统路径下。这样便于管理DLL文件,也使得程序更加模块化。
### DLL_CALL2:使用COM接口方式调用DLL中类的成员函数
- **COM (Component Object Model)**: COM是一种接口标准,用于软件组件之间通信。在Qt中,可以通过COM接口访问DLL中的类成员。
- **QLibrary**: 调用DLL中类的成员函数时,仍然可以使用QLibrary。通过getTESTDLL这样的函数,可以获取接口指针。
- **头文件包含**: 需要包含DLL导出的头文件,这不仅是为了知道对象的函数指针,也是为了了解接口的原型。
- **跨DLL界限调用**: 这种方式允许跨DLL的界限调用类的成员函数,提供了一种面向对象的调用机制。
### DLL_CALL2_3:使用QPluginLoader加载插件形式的DLL
- **QPluginLoader**: QPluginLoader是一个用于加载编译好的插件的类。它在运行时动态加载插件,并提供了一个接口指针,该指针可以用来调用插件提供的函数。
- **头文件包含**: 在使用QPluginLoader加载插件时,必须包含插件的头文件,这样才知道插件接口的原型。
- **插件式编程**: 使用QPluginLoader可以实现插件式编程,即程序可以在不重新编译整个程序的情况下,添加新的功能模块。
### DLL_CALL3:静态链接形式
- **项目配置**: 在Qt Creator中,可以通过右键项目然后选择添加库的方式来将DLL转换为静态库,这需要手动配置。
- **头文件**: 添加库后,头文件的存在使得可以直接使用DLL中的类和全局函数。
- **位置要求**: 静态链接时,DLL文件(此时称为lib文件)必须放置在可执行文件(.exe)旁边,或者放在系统目录下,以确保程序能正确找到并加载它们。
### 总结
在Qt编程中,DLL的使用提供了灵活性和模块化的优势,通过以上介绍的三种主要方法,开发者可以根据实际需求选择合适的方式进行库的调用。使用QLibrary适合调用全局函数和类的成员函数;QPluginLoader适合插件式的扩展;而静态链接则适合将库文件直接集成到应用程序中。每种方法都有其适用场景和特点,选择时需要考虑项目的具体需求和预期的维护方式。
相关推荐

















centlif
- 粉丝: 8
最新资源
- transit-cl: Common Lisp的传输格式实现介绍
- 构建猜词Web应用程序:无提示,五次机会
- 如何通过Docker搭建支持sqlite3的Seafile实例
- 解决TinySine HM10上CC2541蓝牙芯片编码失败问题
- 软考高级精选论文:系统分析师论文集锦
- 掌握Firebase认证:深入JavaScript实现
- 95社区开源项目:易语言对接第三方平台
- DroidCon 2015技术演讲:iBeacon应用演示与室内定位技术
- 掌握melonJS:优化的Awesomenauts网络开发课程项目
- 招银网络Java笔试题解析及编程基础的重要性
- Symfony2 SMS Bundle包:PHP短信功能集成指南
- Salesforce.com 仓库扩展:Canvas 应用程序与 Spring MVC 整合演示
- MEAN.JS全栈解决方案:构建基于MongoDB、Express、AngularJS和Node.js的应用
- YY群私密管理新工具:全自动私密软件发布
- 手机数据分析课程:IPython与RStudio远程操作指南
- 2015年数据可视化艺术课程精要
- 无界限瑜伽疗法网站:Lisa Hughes的在线应用实践
- AI算法岗求职指南:招银网络java科技笔试题解析
- Echarts v1.6.0.241商业级图表库源码与示例解析
- 内容感知图像调整神器——Seam-Carver技术解析
- 应用脚本监控工具:分享轻量级解决方案与集成通知功能
- 南方公园许可证深度解析:软件开源与讽刺并存的特殊授权
- 易语言新版本:原始版RichTextBox.fne支持库发布
- 精易组件库_属性框新特性与修复版本更新