QT调用动态链接库实例
2013-12-02 15:44
417 查看
一、动态链接库调用方式
参考/article/1718472.html1、动态调用 Run-time Dynamic Linking
动态调用主要通过API函数(Window LoadLibrary、GetProcAddress、FressLibrary)来调用程序运行后需要的DLL函数,节省内存空间。QT中,则主要通过QLibrary进行动态加载(适用于跨平台)。2、静态调用 Load-time Dynamic Linking
静态调用前提是在编译之前已经明确知道调用DLL中的哪些函数,需要lib和相应的导入头文件*.h。编译时,在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其连接入调用程序的执行空间中,其主要目的是便于代码共享。二、QT 5.0调用CVI生成的动态链接库实例
1、CVI生成动态链接库
CVI是个很强大的开发工具创建过程参考
http://wenku.baidu.com/link?url=hvST1qn3UTjIYvLimf2cSDovK5YCagHU--WjRKOqXlYplBV-MXEGS-jqikiZlnRTNh3GM4efyFy_GSqGC26QMZWN5UUBkUSmeV3uJPXrBj3
代码dll1.h和dll1.c #ifndef __dll1_H__ #define __dll1_H__ #include "cvidef.h" int __stdcall Add(int, int); #endif /* ndef __dll1_H__ */
#include <cvirte.h> #include "dll1.h" int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: if (InitCVIRTE (hinstDLL, 0, 0) == 0) return 0; /* out of memory */ break; case DLL_PROCESS_DETACH: CloseCVIRTE (); break; } return 1; } int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { /* Included for compatibility with Borland */ return DllMain (hinstDLL, fdwReason, lpvReserved); } /*extern "C" */int __stdcall Add(int x, int y) { return x+y; }
2、QT动态链接库的调用
2.1 动态调用
#include "mydlg.h" #include "ui_mydlg.h" #include "qmessagebox.h" #include <QLibrary> MyDlg::MyDlg(QWidget *parent) : QDialog(parent), ui(new Ui::MyDlg) { ui->setupUi(this); } MyDlg::~MyDlg() { delete ui; } void MyDlg::on_pushButton_clicked() { int a = 10; int b = 11; int c = 0; typedef int (*myfun)(int ,int); QLibrary hdll("dll1.dll"); if(hdll.load()) { QMessageBox::about(this, "Msg","Load Success!"); myfun fun1 = (myfun)hdll.resolve("Add"); if(fun1) { c = fun1(a, b); QString result_msg = tr("dll加载成功!")+QString::number(c,10); QMessageBox::about(this, "Result", "The Sum is "+result_msg); } hdll.unload(); } }
2.2 静态调用
参考http://hi.baidu.com/ayuyuan/item/756788382b4c95573075a1c6在XX.pro中添加: LIBS += ./debug/dll1.lib
创建并添加头文件:dll2.h
//dll2.h #ifndef DLL2_H #define DLL2_H //#pragma comment(lib, "dll1.lib") extern "C" __declspec(dllimport) int __stdcall Add(int, int); #endif // DLL1_H //myDlg.cpp中直接使用DLL函数 void MyDlg::on_pushButton_clicked() { int a = 10; int b = 11; int c = 0; c = Add(a, b); QString result_msg = tr("dll加载成功!")+QString::number(c,10); QMessageBox::about(this, "Result", "The Sum is "+result_msg); }
相关文章推荐
- 如何完成一个动态链接库,完成JNI调用实例
- Qt实例分析——QML调用C++方法, C++调用QML
- Linux下使用QT编写和调用动态链接库(.so文件)
- Qt调用系统动态链接库(系统API)
- Qt实例分析——QML调用的C++类型添加自定义类型的属性列表
- QT隐式调用动态链接库(转)
- Qt5.9动态调用c++的dll方法(Qt5.9调用MQTT的一个实例)
- QT Creator调用动态链接库实例
- 【VS2010学习笔记】【编程实例】 (含有类的动态链接库的封装和调用)
- QT调用VC 动态链接库 解决QT打开或保存文件时闪退的问题
- Qt之操作数据库(SQLite)实例
- 多线程调用COM实例
- windows下qt使用动态链接库的方法
- Qt中QGraphics类坐标映射关系详解(有图有真相,实例讲解)
- android 调用系统的照相机和图库实例详解
- Linux下用C语言调用GAS汇编——综合实例
- 利用反射来动态创建实例和调用方法
- C++ 调用Boost 使用正则表达式实例
- 7.7.3: Bean实例的创建方式及依赖配置---调用实例工厂方法创建Bean
- JAVA调用动态链接库(dll)