场景:
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);begincase sign of:begin0:begindoSomething1(Data);end;1:begindoSomething2(Data);end;2:begindoSomething3(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解包。
