Qt 中加载动态链接库实现相互通信

来源:互联网 发布:太原知达常青藤初中 编辑:程序博客网 时间:2024/04/29 12:08

昨天写了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>
















0 0
原创粉丝点击