回调一般用于两个dll之间的调用,要调用不同dll的函数必须函数需要导出,即export.而回调给了一个地址过来就很方便。相当于底层调用上层函数。
callbackTopper.h
#ifndef CALLBACKTOPPER_H
#define CALLBACKTOPPER_H
//**************回调顶层*****************示例********************//
#include <QObject>
#include <QtDebug>
#include "callbackBottom.h"
class callbackTopper : public QObject
{
Q_OBJECT
public:
callbackTopper(QObject *parent = NULL);
~callbackTopper();
static void RefreshNode_CB(void *lp,char* lc);
private:
void outName(char* cha);
};
#endif // CALLBACKTOPPER_H
callbackTopper.cpp
#include "callbackTopper.h"
callbackTopper::callbackTopper(QObject *parent)
: QObject(parent)
{
callbackBottom* pBottom = new callbackBottom();
pBottom->SetCallBackFunc((Refresh_CallBack)RefreshNode_CB, this);
}
callbackTopper::~callbackTopper()
{
}
void callbackTopper::RefreshNode_CB(void *lp,char* lc)
{
callbackTopper * p = (callbackTopper*)(lp);
p->outName(lc);
}
void callbackTopper::outName(char* cha)
{
QString str = QString(QLatin1String(cha));
qDebug() <<"result:" <<str;
}
callbackBottom.h
#ifndef CALLBACKBOTTOM_H
#define CALLBACKBOTTOM_H
//**************回调底层*****************示例********************//
#include <QObject>
typedef void(*Refresh_CallBack)(void *, char *); // 函数指针
class callbackBottom : public QObject
{
Q_OBJECT
public:
callbackBottom(QObject *parent= NULL);
~callbackBottom();
void SetCallBackFunc(Refresh_CallBack p, void* lpObject);
private:
void* m_pUserData;
Refresh_CallBack m_pFunc;
void* m_pObject;
};
#endif // CALLBACKBOTTOM_H
callbackBottom.cpp
#include "callbackBottom.h"
callbackBottom::callbackBottom(QObject *parent)
: QObject(parent)
{
m_pUserData = NULL;
m_pFunc = NULL;
m_pObject = NULL;
}
callbackBottom::~callbackBottom()
{
}
void callbackBottom::SetCallBackFunc(Refresh_CallBack callback, void* lpObject)
{
callback(lpObject, "test");
}
解析:
1. callbackTopper把自己的指针传给callbackBottom, pBottom->SetCallBackFunc((Refresh_CallBack)RefreshNode_CB, this);
this当然也可以是你想传入的其他指针地址。
2. callbackBottom里面假设在处理一些数据,数据保存在char*里面
3. 然后在callbackBottom中就可以声明一个回调函数指针typedef void(*Refresh_CallBack)(void *, char *);
4. 然后实际处理的函数就是RefreshNode_CB这个函数了。这样底层就调用了上层,并且上层也得到了底层传来的数据。