gpt4 book ai didi

delphi - 快速识别当前过程调用位置的方法

转载 作者:行者123 更新时间:2023-12-03 18:21:16 26 4
gpt4 key购买 nike

我需要找到一种方法来识别类中当前函数或过程的调用位置。结果是内存位置还是单元和行号并不重要,只是调用来自的唯一位置。

需要快速计算位置 ID,因为它将用于决定缓存数据是否可用。

例如。

type
TTestObject = class
public
procedure TestProc;
procedure TestCall;
end;

...

procedure TTestObject.TestProc;
begin
TestCall; // "Point A" - Displays "Point A"
TestCall; // "Point B" - Displays "Point B"
end;

procedure TTestObject.TestCall;
begin
ShowMessage(SomehowGetTheCallingLineLocation); // Displays "Point A" or "Point B" depending on which line above it is called from
end;

end.

调用 TestProc 时将显示“A 点”,然后显示“B 点”,无论创建了多少个 TTestObject 实例或它们驻留在内存中的位置。

该功能将用于生成 SQL。目前,我将 GUID 传递给生成 SQL 的调用。如果 SQL 已经生成,则使用此 GUID 从缓存中提取 SQL。

  NewCommand(NewUpdateCriteria('{C43D3B79-9E73-4A4B-9E29-0553542AD0B2}').
SetValue('AFIELD', AValue).
Table
('ATABLE').
Where
(NewSQLComparitor
('ID', EqualTo, AID)));

调用位置的查找需要很快,否则它会抵消我们通过缓存 SQL 应该看到的速度改进。

该组件最终可能会开源,因此我无法使用任何商业第三方组件。我还想避免依赖于 JEDI 等开源库。

最佳答案

根据您更新的问题,您只需能够识别一个调用与另一通调用来自不同的地点。在这种情况下,您可以使用返回地址来识别调用者。并且可以通过调用未公开的内部函数System.ReturnAddress来获取返回地址。

这个程序:

{$APPTYPE CONSOLE}

uses
System.SysUtils;

procedure Foo;
begin
Writeln(IntToHex(NativeInt(ReturnAddress), 8));
end;

begin
Foo;
Foo;
Foo;
Foo;
end.

在我的机器上产生以下输出:

0041B4910041B4960041B49B0041B4A0

关于delphi - 快速识别当前过程调用位置的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30578596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com