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