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
- Qt 中加载动态链接库实现相互通信
- Qt加载动态链接库
- Qt加载动态链接库
- Qt 加载动态链接库
- 进程间通信 - 动态链接库实现
- 进程间通信 - 动态链接库实现
- 进程间通信 - 动态链接库实现
- 进程间通信 - 动态链接库实现
- 进程间通信 - 动态链接库实现
- 进程间通信 - 动态链接库实现
- 进程间通信 - 动态链接库实现
- 进程间通信 - 动态链接库实现
- 深度解析 Qt 中动态链接库
- Qt中动态链接库的使用
- Qt中动态链接库的使用
- Qt中动态链接库的使用
- 深度解析 Qt 中动态链接库
- 深度解析Qt中动态链接库
- hdoj 2076 夹角有多大
- Cocos-code-ide使用入门学习
- 实现置顶功能jQuery
- Practical Node.js: Building Real-World Scalable Web Apps
- 经典重读《信号与系统》-第七章
- Qt 中加载动态链接库实现相互通信
- [Leetcode]Pascal's Triangle
- 对象设计要考虑有效范围
- 机主信息
- unity3d 如何获得unity3d物体尺寸
- 黑马程序员 java基础之list集合
- New Year Book Reading
- Find distance between two given keys of a Binary Tree
- 将JSON对象格式化输出(breakdown篇)