QT 調用動態庫接口方法

我們在做大型項目的時候,經常會遇到好多重複或常用的部分,如果每次都重新編寫固然是可以的,不過那樣會大大降低工作效率,並且影響代碼的可讀性,更不利於後期的代碼維護。我們可以把他們製作成相應的功能函數,比如動態庫,這樣還可以對項目進行分工,加快項目的進度。下面就是qt 調用動態庫接口的方法。

首先編譯一個簡單的動態庫接口文件Test.dll 
新建一個普通的qt項目,代碼如下:

#include "testdll.h"

#include <QLibrary>
#include <QDebug>
QString DLL_NAME = "Test.dll";      //庫文件名
QString DLL_PATH = "./bin/";       //庫文件路徑



typedef int (*jk_TEST_A)();//根據動態庫接口函數返回值類型定義一個類型
typedef int (*jk_TEST_B)();//該dll接口的返回值全爲int
typedef int (*jk_TEST_C)();
typedef int (*jk_TEST_D)();


jk_TEST_A   TEST_A;  //根據類型定義自己調用的函數名
jk_TEST_B   TEST_B;
jk_TEST_C   TEST_C;
jk_TEST_D   TEST_D;

TestDll::TestDll(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::TestDll)
{
    ui->setupUi(this);

    this->loadLibrary();
    qDebug() << TEST_A() << endl;
    qDebug() << TEST_B() << endl;
    qDebug() << TEST_C() << endl;
    qDebug() << TEST_D() << endl;

}

TestDll::~TestDll()
{
    delete ui;
}

bool TestDll::loadLibrary()
{
    //將庫接口與自己定義的調用接口名關聯起來
    //前面的爲自己要調用的函數名
    //括號裏的爲動態庫的接口名
    QLibrary myLib(DLL_PATH + DLL_NAME);
    TEST_A = (jk_TEST_A)myLib.resolve("TEST_A");
    TEST_B = (jk_TEST_B)myLib.resolve("TEST_B");
    TEST_C = (jk_TEST_C)myLib.resolve("TEST_C");
    TEST_D = (jk_TEST_D)myLib.resolve("TEST_D");
    return myLib.isLoaded();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

接口函數

這裏寫圖片描述

結果

這裏寫圖片描述

完美調用

注:Test.dll 放在在exe目錄下的 bin目錄下

Test.dll 是 vc++ 編譯的,具體編譯方法請看下一條

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章