场景:
dll封装第三方api中的回调函数。
在delphi中要响应其回调函数。
即:funA在delphi中实现。要在dll文件中(C++)中调用。
如下图:
当响应函数触发时,可以主动调用delphi中的某函数。
思路
非跨语言时,就是回调函数的使用。
即:声明一个指向doSomething函数的函数指针,响应函数调用该函数指针即可。
在跨语言情况下(当前情况,delphi和C++导出的dll动态链接库)
在调用请求函数前,可以进行一次响应函数绑定。
C++ 中实现一个这种函数并且导出 —> bindFunction(void *funPoint);
delphi中调用这个函数并且将doSomething 传入 funPoint中。
然后响应函数调用这个传入的函数指针即可。
多个响应函数
当响应函数多,要绑定多个doSomething时,未免有些麻烦。
解决方法:
定义一个通用函数(假设叫作:OnResponseFun(int sign,void * data);)。将此函数指针传给C++端。
在OnResponseFun作case,根据sign来进行判断调用某个doSomething。
例如:
现在有3个doSomethingFunction:
doSomething1();
doSomething2();
doSomething3();
声明On明OnResponseFun();
//Delphi中:
procedure OnResponseFun(sign:Integer,Pointer Data);
begin
case sign of:
begin
0:
begin
doSomething1(Data);
end;
1:
begin
doSomething2(Data);
end;
2:
begin
doSomething3(Data);
end;
end;
end;
C++的响应函数中:
void OnResponse1(void * data)
{
...
OnResponseFun(0,data);
}
void OnResponse2(void * data)
{
...
OnResponseFun(2,data);
}
void OnResponse3(void *data1,void *data2)
{
...
struct1 data;
data.data1 = data1;
data.data2 = data2;
OnResponseFun(2,data);
}
这样只需要绑定函数指针即可。缺点就是在响应函数返回参数不固定时,需要像OnResponse3中那样,进行数据封装,然后再在delphi解包。