场景:
dll封装第三方api中的回调函数。
在delphi中要响应其回调函数。
即:funA在delphi中实现。要在dll文件中(C++)中调用。
如下图:
image.png
当响应函数触发时,可以主动调用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();

  1. //Delphi中:
  2. procedure OnResponseFun(sign:Integer,Pointer Data);
  3. begin
  4. case sign of:
  5. begin
  6. 0:
  7. begin
  8. doSomething1(Data);
  9. end;
  10. 1:
  11. begin
  12. doSomething2(Data);
  13. end;
  14. 2:
  15. begin
  16. doSomething3(Data);
  17. end;
  18. end;
  19. end;

C++的响应函数中:

  1. void OnResponse1(void * data)
  2. {
  3. ...
  4. OnResponseFun(0,data);
  5. }
  6. void OnResponse2(void * data)
  7. {
  8. ...
  9. OnResponseFun(2,data);
  10. }
  11. void OnResponse3(void *data1,void *data2)
  12. {
  13. ...
  14. struct1 data;
  15. data.data1 = data1;
  16. data.data2 = data2;
  17. OnResponseFun(2,data);
  18. }

这样只需要绑定函数指针即可。缺点就是在响应函数返回参数不固定时,需要像OnResponse3中那样,进行数据封装,然后再在delphi解包。