DLL在Qt中的创建与使用

学习之前先了解一下链接库的基本知识链接库预备知识

库包含静态链接库 动态连接库 (动态装载:静态绑定与动态绑定)
目前以lib后缀的库有两种,
一种为静态链接库(Static Libary,以下简称“静态库”), 包含了实际的代码和符号
一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。 包括地址符号表。
动态链接库的调用 隐示连接 与 显示连接

对Qt动态链接库的生成方法,主要包括:

1使用Qt中的库

2使用Qt的插件类QPlugin


对QT动态链接库的调用方法,主要包括:

1、显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法

2、显链接DLL,调用DLL中类对象、成员函数。(通过对象即可实现类成员函数的调用)

①用虚函数表的方法,这也是COM使用的方法,利用Qt的QLibrary技术调用;

用Qt的QPluginLoader类直接调用生成的DLL插件类对象。

3、隐式链接DLL:调用DLL全局函数以及类对象、成员函数。


显式连接

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

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

态链接库(DLL)中的输出库函数地址,以备调用。FreeLibrary() 释放dll所占空间。

Qt中的显式调用DLL使用采用Qt的QLibrary方法

QLibrary类显示链接调用DLL的步骤:load()、resolve(const char * symbol )、unload()与之对应


隐式链接

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

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

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

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

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

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

LIBS的用法 LIBS += -L地址 -l库名 注意 -L后面没有空格直接加地址,然后空格-l库名地址和-l库名之间是有空格的。


Qt中的隐式调用 (这里的直接使用dll文件,dll文件是由Qt生成的,如果dll是由vs等其他生成还需验证)

INCLUDEPATH += -l-l 参数指定导入库文件名(不要加扩展名)  若将需要的头文件放入到了源程序目录下,可以不需要这一句

LIBS+= -l 如果编译器为mingw 直接添加.dll文件不用添加.a文件


动态链接库(DLL)生成与使用

1 在Qt中创建C++库进而生成dll。QT5 动态链接库的创建和使用 这里连接给予了创建与使用,调用的方法采取的是隐式链接,调用了类对象、成员函

数,并没有调用全局函数。

接着上面连接的代码,完成调用全局函数。

在sld.cpp中添加

void shuchu()
{
    qDebug() << "调用全局函数";
}

在sld.h中添加

extern "C" SLDSHARED_EXPORT void shuchu();  //自定义的外部函数

最后在mainwindow.cpp中添加

void MainWindow::on_pushButton_clicked()
{
 
  
    ···
 
  
    shuchu();   //调用sld.dll中的全局函数
 
  
    ····
}


2将上面的隐式链接的程序进行修改,完成显式连接的调用
调用DLL的全局函数,采用Qt的QLibrary方法

在mainwindow.cpp中添加

#include 

typedef void (*Fun)(void); //定义函数指针

在其构造函数中添加
QLibrary mylib("sld.dll");   //声明所用到的dll文件  这个路径是默认的DESTDIR =..\MyDebug   实际情况根据dll的位置更改路径
 if (mylib.load()){  //载入
	
//调用外部函数shuchu()
                Fun add = (Fun)mylib.resolve("shuchu");
                //是否成功连接上 add() 函数
                if (add)
                    {
                        qDebug() << "Link to add Function is OK!"< 
  
                         //这里函数指针调用dll中的 add() 函数
                        add();
                    }
}
mylib.unload();	//释放	

调用DLL的类对象、成员函数。

a 虚函数表的方法,Qlibrary的技术调用

在sld.h中添加

 
  
virtual QString GetStr();
extern "C" SLDSHARED_EXPORT Sld* getSlddll(); //获取类Sld的对象
在sld.cpp中添加
Sld* getSlddll()
 {
     return new Sld();
 }
 保存编译下。 
  

在mainwindow.cpp中添加

#include "../sld/sld.h" //头文件还是需要加的,解析sld类
 
  
typedef Sld* (*GetSlddll)();//定义函数指针,获取类TestDLL对象;
 
  
QLibrary mylib("sld.dll");   //声明所用到的dll文件  这个路径是默认的DESTDIR =..\MyDebug 实际情况根据dll的位置更改路径
    if (mylib.load())  //载入
    {            
 
  
               //调用类对象、成员函数
                GetSlddll getsld = (GetSlddll)mylib.resolve("getSlddll");
                if(getsld)
                {
                    qDebug() << "SLD Link to add Function is OK!"< 
  
                    Sld *sld = getsld();
                    QMessageBox * msg=new QMessageBox(this);
                    msg->setText(sld->GetStr());
                    msg->show();
                    delete sld;
                }
        }


上DLL在Qt创建与调用的方法对应的代码



你可能感兴趣的:(Qt)