1. 程式人生 > >qt so庫回撥函式的實現

qt so庫回撥函式的實現

主要參考windows的做法,這個跟系統沒有關係,只要是C++都是一樣的

參考文章

http://blog.csdn.net/zcabcd123/article/details/8185114

so庫程式碼

#ifndef MAKE_SO_H
#define MAKE_SO_H

#include "make_so_global.h"

class Test_SO;
typedef void(*Emit)(Test_SO*, char*, int);     //函式指標型別定義

class MAKE_SOSHARED_EXPORT Make_so
{

public:
    Make_so();
    int add(int a,int b);
    void SetSignal(Test_SO *commn,   Emit func);
    void OnReceive();
    void GetData();
public:
    Emit emitSignal;
    Test_SO * pComm;   //Qt中類例項的指標,指向Qt主程式中的類例項,作回撥函式的實

};

#endif // MAKE_SO_H

#include "make_so.h"

Make_so::Make_so()
{
}
int Make_so::add(int a,int b)
{
    return a+b;
}

void Make_so::SetSignal(Test_SO  *commn,   Emit func)
{
     emitSignal = func;       //傳遞Qt主程式裡的函式(回撥函式)指標
     pComm = commn;      //傳遞Qt主程式裡的類例項指標
}

void Make_so::GetData()
{
    OnReceive();
}

char *pDataBuffer;           //接收資料快取指標
int  iLength;                    //接收到的位元組數
void Make_so::OnReceive()             //過載接收函式
{
         int dataLen = 10;
         emitSignal(pComm,pDataBuffer,dataLen);
}

qt主程式

#include "test_so.h"
#include "ui_test_so.h"
#include "addlib/make_so.h"
#include "QMessageBox"
#include "QSettings"

void SetIt(Test_SO *comm, char *data, int len)
{
    qDebug("GOT DATA!");
    qDebug("len=%d" ,len);
    comm->test1();
}

Test_SO::Test_SO(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Test_SO)
{
    ui->setupUi(this);
}

Test_SO::~Test_SO()
{
    delete ui;
}

void Test_SO::on_pushButton_clicked()
{   
    qDebug("click pushbutton!");
    Make_so TestAdd;
    TestAdd.SetSignal(this,   SetIt);//設定訊號與回傳
    TestAdd.GetData();
}

void Test_SO::test1()
{
    qDebug("1111111111111111111!");
}