qt使用动态库(DLL)

http://blog.csdn.net/zhuce0001/article/details/20651025
本文主要讲解在QT开发环境中如何使用VC生成的DLL及QT自身生成的DLL。至于其它情况本文不作讨论。
连接库分为2种
(1)动态连接库,通常有.h .lib .dll三个文件,功能实现在dll中
(2)静态连接库,通常有.h .lib二个文件,功能实现在lib中
由上可以看出动态库的lib和静态库的lib文件是不同的。
    如果使用生成连接库的开发环境与使用连接库的开发环境相同,一般不会出什么问题,如VC写的连接库
(包括动态库和静态库)还在VC中用一般不会有什么问题的。有时候我们需要DLL跨开发环境,如以前VC下的
DLL想在QT中用。有网友说QT不支持VC生成的静态库,所以只测试QT使用动态库的情况。
【先看VC生成的DLL】
使用VC6建立Win32 dynamic-link library工程,工程中只有两个文件,编译即可生成DLL和LIB
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // MFCDLL.h  /  
  2. #ifndef _MFCDLL_H  
  3. #define _MFCDLL_H  
  4.   
  5. #ifdef __cplusplus  
  6. extern "C" {  
  7. #endif  
  8.   
  9. #ifdef DLL  
  10.     // do nothing  
  11. #else  
  12. #define DLL __declspec(dllimport)  
  13. #endif  
  14.   
  15. DLL void hello();  
  16. DLL int add(int a, int b);  
  17.   
  18. #ifdef __cplusplus  
  19. }  
  20. #endif  
  21.   
  22. #endif  
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // MFCDLL.cpp  /  
  2. #define DLL __declspec(dllexport)  
  3. #include "MFCDLL.h"  
  4. #include <windows.h>  
  5.   
  6. void hello()  
  7. {  
  8. ::MessageBox(NULL, "hello world!",   
  9. "greeting", MB_OK);  
  10. }  
  11.   
  12. int add(int a, int b)  
  13. {  
  14. return a + b;  
  15. }  
【使用QT生成DLL】使用QT建立动态库工程,编译即可得到DLL(无LIB文件)
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // qtdll_global.h  //  
  2. #ifndef QTDLL_GLOBAL_H  
  3. #define QTDLL_GLOBAL_H  
  4.   
  5. #include  
  6.   
  7. #if defined(QTDLL_LIBRARY)  
  8. #  define QTDLLSHARED_EXPORT Q_DECL_EXPORT  
  9. #else  
  10. #  define QTDLLSHARED_EXPORT Q_DECL_IMPORT  
  11. #endif  
  12.   
  13. #endif // QTDLL_GLOBAL_H  
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // qtdll.h  /  
  2. #ifndef QTDLL_H  
  3. #define QTDLL_H  
  4.   
  5. #include "qtdll_global.h"  
  6.   
  7. class QTDLLSHARED_EXPORT QTDLL  
  8. {  
  9. public:  
  10.     QTDLL();  
  11.   
  12. public:  
  13.     int add(int a, int b);  
  14. };  
  15.   
  16. #endif // QTDLL_H  
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // qtdll.cpp  ///  
  2. #include "qtdll.h"  
  3.   
  4.   
  5. QTDLL::QTDLL()  
  6. {  
  7. }  
  8.   
  9. int QTDLL::add(int a, int b)  
  10. {  
  11.     return a + b;  
  12. }  
【QT显式加载VC生成的DLL】
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3. #include <QLibrary>  
  4. #include <QDebug>  
  5.   
  6. MainWindow::MainWindow(QWidget *parent) :  
  7.     QMainWindow(parent),  
  8.     ui(new Ui::MainWindow)  
  9. {  
  10.     ui->setupUi(this);  
  11.   
  12.     // DLL显式加载,只需要DLL文件即可,不需要.H和.LIB文件  
  13.     // 需要将DLL放到可执行目录中  
  14.     typedef void(*FUN1)();  
  15.     typedef int(*FUN2)(intint);  
  16.   
  17.     QLibrary lib("MFCDLL.dll");  
  18.     if (lib.load()) {  
  19.         qDebug() << "load ok!";  
  20.   
  21.         FUN1 hello = (FUN1)lib.resolve("hello");  
  22.         FUN2 add = (FUN2)lib.resolve("add");  
  23.         if (hello) {  
  24.             qDebug() << "load hello ok!";  
  25.             hello();  
  26.         }  
  27.         if (add) {  
  28.             qDebug() << "load add ok!";  
  29.             qDebug() << add(3, 5);  
  30.         }  
  31.     } else {  
  32.         qDebug() << "load error!";  
  33.     }  
  34. }  
【QT隐式加载VC生成的DLL】
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3. #include "lib/MFCDLL.h"  
  4. #include <QDebug>  
  5.   
  6. MainWindow::MainWindow(QWidget *parent) :  
  7.     QMainWindow(parent),  
  8.     ui(new Ui::MainWindow)  
  9. {  
  10.     ui->setupUi(this);  
  11.   
  12.     // DLL隐式加载,只需要.DLL .H和.LIB文件  
  13.     // 1需要将DLL放到可执行目录中  
  14.     // 2将LIB路径设置到项目PRO文件中  
  15.     // 3将头文件包含进来,如果不包含需要自已声明函数原型及来源(本质与包含头文件相同)  
  16.     hello();  
  17.     qDebug() << add(5, 6);  
  18.     qDebug() << "ok";  
  19. }  
pro工程文件中要设置LIB文件路径
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. # lib文件路径  
  2. LIBS += "F:/lib/MFC_DLL_TEST_WITH_QT_2/lib/MFCDLL.lib"  
【QT使用QT生成的动态库,隐式】
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3. #include <QDebug>  
  4. #include "lib/qtdll.h"  
  5.   
  6. MainWindow::MainWindow(QWidget *parent) :  
  7.     QMainWindow(parent),  
  8.     ui(new Ui::MainWindow)  
  9. {  
  10.     ui->setupUi(this);  
  11.   
  12.     // QT使用QT生成的DLL  
  13.     // 1. 包含头文件  
  14.     // 2. 在工程文件中指定lib路径  
  15.     // 3. 将动态库拷贝到可执行文件目录  
  16.     QTDLL dll;  
  17.     qDebug() << dll.add(3, 5);  
  18. }  
pro工程文件中的设置
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片

  1. LIBS += "F:/lib/QT_DLL_TEST_WITH_DLL/lib/QTDLL.dll" 


http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html

声明: 事先我已经自己动手写了一个简单的dll文件(myDLL.dll),C版接口的。并且用我前两篇有关DLL文章里面的方法,从dll中导出了导入库(.lib)文件,dll中有两个函数,原型如下:

    void HelloWorld();      //函数内部调用Win32 API,功能是弹出一个helloworld提示框
    int add( int a, int b);   //实现两个数相加,并返回结果

 下面分别通过显示调用和隐式调用两种方法,来模拟Qt如何调用外部dll文件中的功能函数,follow me....

 

预备知识:

     1、如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用。

     2、通常Windows下程序显示调用dll的步骤分为三步(三个函数):LoadLibrary()、GetProcAdress()、FreeLibrary()

 其中,LoadLibrary() 函数用来载入指定的dll文件,加载到调用程序的内存中(DLL没有自己的内存!)

         GetProcAddress() 函数检索指定的动态链接库(DLL)中的输出库函数地址,以备调用

         FreeLibrary() 释放dll所占空间 

 

1、显示调用 

      Qt提供了一个 QLibrary 类供显示调用。下面给出一个完整的例子:

复制代码
 1 #include <QApplication>
 2 #include <QLibrary>
 3 #include <QDebug>
 4 #include <QMessageBox>
 5 #include  " dll.h "              //引入头文件
 6 typedef  int (*Fun)( int, int);  //定义函数指针,以备调用
 7  int main( int argc, char **argv)
 8 {
 9     QApplication app(argc,argv);
10     QLibrary mylib( " myDLL.dll ");    //声明所用到的dll文件
11      int result;
12      if (mylib.load())               //判断是否正确加载
13     {
14         QMessageBox::information(NULL, " OK ", " DLL load is OK! ");
15         Fun open=(Fun)mylib.resolve( " add ");     //援引 add() 函数
16          if (open)                   //是否成功连接上 add() 函数
17         {
18             QMessageBox::information(NULL, " OK ", " Link to Function is OK! ");
19             result=open( 5, 6);       //这里函数指针调用dll中的 add() 函数
20             qDebug()<<result;
21         }
22          else
23             QMessageBox::information(NULL, " NO ", " Linke to Function is not OK!!!! ");
24     }
25      else
26         QMessageBox::information(NULL, " NO ", " DLL is not loaded! ");

27         return 0;  //加载失败则退出

28}

复制代码

 myDLL.dll为自定义的dll文件,将其复制到程序的输出目录下就可以调用。显然,显示调用代码书写量巨大,实在不方便。

 

2、隐式调用

    这个时候我们需要三个文件,头文件(.h)、导入库文件(.lib)、动态链接库(.dll),具体步骤如下:

1、首先我们把 .h 与 .lib/.a 文件复制到程序当前目录下,然后再把dll文件复制到程序的输出目录,

2、下面我们在pro文件中,添加 .lib 文件的位置: LIBS+= -L D:/hitempt/api/ -l myDLL

         -L 参数指定 .lib/.a 文件的位置

         -l  参数指定导入库文件名(不要加扩展名) 

         另外,导入库文件的路径中,反斜杠用的是向右倾斜的 

3、在程序中include头文件(我试验用的dll是用C写的,因此要用 extern "C" { #include "dll.h" } )

 下面是隐式调用的实例代码:

复制代码
 1 #include <QApplication>
 2 #include <QDebug>
 3  extern  " C "     //由于是C版的dll文件,在C++中引入其头文件要加extern "C" {},注意
 4 {
 5         #include  " dll.h "
 6 }
 7  int main( int argv , char **argv)
 8 {
 9        QApplication app(argv,argv);
10        HelloWordl();           // 调用Win32 API 弹出helloworld对话框
11        qDebug()<<add( 5, 6);     //  dll 中我自己写的一个加法函数
12         return 0;   //完成使命后,直接退出,不让它进入事件循环
13 }
复制代码

还是隐式调用方便啊,直接就可以调用dll中的函数...








 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值