【发布时间】:2021-03-06 16:49:12
【问题描述】:
我可以将以下内容传递给旧版本的 dll
type
PCallbackList = ^TCallbackList;
TCallbackList = record
arg: Pointer;
CallBack1: procedure(arg: Pointer; p1: Pointer; error: PAnsiChar); cdecl;
CallBack2: procedure(arg: Pointer; error: PAnsiChar); cdecl;
end;
当回调被触发时,我将 arg 转换为在传递回调列表之前分配给它的对象实例。
现在 dll 已更改,新签名为:
type
PCallbackList = ^TCallbackList;
TCallbackList = record
CallBack1: procedure(p1: Pointer; error: PAnsiChar); cdecl;
CallBack2: procedure(error: PAnsiChar); cdecl;
end;
所以现在arg指针被删除了,我无法通过列表将对象实例的引用传递给dll,所以我无法知道回调属于哪个实例。
那么如何将对象方法作为回调方法传递呢?
【问题讨论】:
-
如果无法传递对原始实例的引用,则无法确定它引用的是哪一个,除非只有一个实例。在这种情况下,您需要有一个“全局”引用,即相关类的全局变量或类变量
-
@DaveNottage 不幸的是,有不止一个实例在使用这个 dll。所以我需要一些方法来知道回调是针对哪一个的。
-
如果每个实例都在一个单独的线程中,您可能会使用 ThreadVar
-
@RemyLebeau 你能写出你所有的 cmets 作为答案,以便我接受吗?你基本上给出了大部分可能的解决方案。
-
@RemyLebeau 感谢您分享宝贵的经验。
标签: delphi firemonkey delphi-10.3-rio