Qt 中加載動態鏈接庫實現相互通信

昨天寫了windows下關於動態鏈接庫的基本原理,今天在Qt下測試了一把!蠻成功的,下面只是把一些主要的內容貼了下!

功能:介紹Qt(windows)加載動態鏈接庫的方法、原理。實現在主程序中加載DLL,並可以實現主程序和DLL之間的相互通信。(之前是利用虛函數的方式實現的,但是當時沒有實現相互通信,只實現加載調用。還得研究研究……)

一.圖例直觀表示整個過程

先直接上圖,對整個加載運行過程有個直觀的感受

二.創建DLL過程

在otherproject選項下選擇empty projet,點擊choose,輸入name和createin,點擊next,然後一直點擊finish,直到完成。

創建工程完成之後,在Qtcreator顯示爲


配置.pro文件

1.  可以在Qt creator中修改,也可以在工程目錄下以記事本打開.pro文件修改,如

2.       選擇生成release版本的.dll文件

三.主要代碼

1.主函數中的接口

<span style="font-size:18px;">
typedef void (*createTab)(tabWidget *mTab,
                          QWidget *sender,
                          int index,
                          void (*fun)(tabWidget *mTab,int index,const QString returnValue)
);
typedef void (*showTab)();
typedef void (*closeTab)();
typedef void (*deleteTab)();
void callbackFun(tabWidget  *mTab,
                        int index,
                         const QString returnValue)
{……}
void tabWidget::loadPlugin(int index)
{
    lib = new QLibrary("M0_Plugin.dll");//此處必須與相應的DLL對應
    if (lib->load()) {
        qDebug() <<  " load success!" << __FILE__ << __LINE__;
    } else {
        qDebug() <<  " load failed!" << __FILE__ << __LINE__;
        return;
    }
    createTab __createTab = (createTab)lib->resolve("Client");
    if (__createTab){
        __createTab(this,this->currentWidget(),index,callbackFun);//根據自己的情況修改
        qDebug() << " createTab successes!" << __FILE__ << __LINE__ ;
    }
    else{
        qDebug("__createTab failed !");
    }
}
void tabWidget::unloadPlugin()
{
    if (lib->isLoaded()){
        deleteTab __deleteTab = (deleteTab)lib->resolve("deleteTab");
        if (__deleteTab){
            qDebug()<<"__deleteTab  loaded"<< __FILE__ << __LINE__ ;
            __deleteTab();
        } else{
            qDebug()<< "__deleteTab failed"<< __FILE__ << __LINE__;
        }
        lib->unload();
        delete lib;
        lib = 0;
    }
}</span>

2.DLL中的接口函數

<span style="font-size:18px;">
#define MY_EXPORT __declspec(dllexport)
class tabWidget;
QDialog *clientTab = 0;
typedef void (*Emit)(tabWidget *mTab,
                           int index,
                     const QString returnValue);
extern "C" MY_EXPORT void Client(tabWidget *mTab,QWidget *sender,int index,Emit signalFun)
{
    clientTab = new M0_Test( index,sender);
    if(clientTab) {
        clientTab->show();
        signalFun(mTab,index, "return Value: ");
    }
}
extern "C" MY_EXPORT void deleteTab()
{
    qDebug() << "deleteFrm()" << __FILE__ << __LINE__;
    if(clientTab) {
        delete clientTab;
        clientTab = NULL;
    }
}
extern "C" MY_EXPORT void closeTab()
{
    if(clientTab) {
        clientTab->close();
    }
}
extern "C" MY_EXPORT void showTab()
{
    qDebug() << "deleteFrm" << __FILE__ << __LINE__;
    if(clientTab) {
        clientTab->show();
    }
}</span>
















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