QT 呼叫動態庫介面方法
阿新 • • 發佈:2019-01-31
我們在做大型專案的時候,經常會遇到好多重複或常用的部分,如果每次都重新編寫固然是可以的,不過那樣會大大降低工作效率,並且影響程式碼的可讀性,更不利於後期的程式碼維護。我們可以把他們製作成相應的功能函式,比如動態庫,這樣還可以對專案進行分工,加快專案的進度。下面就是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();
}
介面函式
結果
完美呼叫
注:Test.dll 放在在exe目錄下的 bin目錄下
Test.dll 是 vc++ 編譯的,具體編譯方法請看下一條