1.首先,说下我对C语言回调的理解,套用我们老大的一句话说:回调,就是回过来调用自己嘛?
一般C语言回调是通过函数指针处理的,但是C语言函数指针只能表示函数的地址,此外没有其他的附属信息(返回值、参数个数、类型检查等等)。据说:C#这家伙有类型检查。看下面的一个例子
#include <stdio.h>
typedef void(*fun)(int);
int n = 2;
void print(int n)
{
printf("the value is %d\n", n);
}
void callback(fun fp)
{
fp();
}
int main()
{
fun fp;
fp = print;
callback(fp);
}
本来是调用callback函数的,但是真实执行的却是fp指向的函数,即print函数。
C++的函数回调,下面的例子是通过对象指针完成的,也就是在要调用的类中包含被调用的类指针,然后调用被调用的类里面的函数。道理是一样的。
MyInterface.h
#pragma once
class IRecv //接收数据接口
{
public:
virtual void RecvFunc(int result)=0;
};
class ISend //发送数据接口
{
public:
virtual void setMyReceiver(IRecv * i) = 0;
virtual void SendFunc(int a, int b) = 0;
};
//因为Send是主动的,我们使用的是send接口
extern "C"
{
ISend * CreateSender();
void FreeSender(ISend * s);
}
DllTest.cpp
#include "MyInterface.h"
class MySender:
public ISend
{
public:
void SendFunc(int a, int b)
{
m_result = a*a + b*b;
TreadFunc();
}
void setMyReceiver(IRecv * pRecv)
{
m_pRec = pRecv;
}
private:
int m_result;
IRecv * m_pRec;
private:
int TreadFunc()
{
m_pRec->RecvFunc(m_result); //通过这个指针回调
return 0;
}
};
ISend * CreateSender()
{
return new MySender;
}
void FreeSender(ISend * s)
{
delete s;
}
LIBRARY DLLTest
EXPORTS
CreateSender
FreeSender
main.cpp
#include <iostream>
#include "..\DllTest\Myinterface.h"
#pragma comment(lib,"..\\Debug\\DLLTest.lib")
class MyRecv :
public IRecv
{
public:
void RecvFunc(int result)
{
std::cout << result<<std::endl;
}
};
int main()
{
ISend * pMySender;
pMySender = CreateSender();
MyRecv rec;
pMySender->setMyReceiver(&rec);
pMySender->SendFunc(1, 2);
int i;
std::cin >> i;
return 0;
}