16,748
社区成员
发帖
与我相关
我的任务
分享
type
TBase = class
public
procedure FooVirtual1; virtual;
procedure FooVirtual2; virtual;
procedure FooDynamic1; dynamic;
procedure FooDynamic2; dynamic;
procedure GetAddrs(var V1, V2, D1, D2: Pointer);
end;
TFoo = class(TBase)
procedure FooVirtual1; override;
procedure FooDynamic1; override;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
v1, v2, d1, d2: Pointer;
begin
Memo1.Clear;
with TBase.Create do
begin
GetAddrs(v1, v2, d1, d2);
Memo1.Lines.Add(Format('[%p] %s', [Pointer(ClassType), ClassName]));
Memo1.Lines.Add(Format(#9'v1: %p'#9'v2: %p'#9'd1: %p'#9'd2: %p',
[v1, v2, d1, d2]));
Free;
end;
with TFoo.Create do
begin
GetAddrs(v1, v2, d1, d2);
Memo1.Lines.Add(Format('[%p] %s', [Pointer(ClassType), ClassName]));
Memo1.Lines.Add(Format(#9'v1: %p'#9'v2: %p'#9'd1: %p'#9'd2: %p',
[v1, v2, d1, d2]));
Free;
end;
end;
{ TBase }
procedure TBase.FooDynamic1;
begin
end;
procedure TBase.FooDynamic2;
begin
end;
procedure TBase.FooVirtual1;
begin
end;
procedure TBase.FooVirtual2;
begin
end;
procedure TBase.GetAddrs(var V1, V2, D1, D2: Pointer);
type
Tfoo = procedure of object;
var
method : TMethod;
foo : TFoo absolute method;
begin
foo := FooVirtual1;
V1 := method.Code;
foo := FooVirtual2;
V2 := method.Code;
foo := FooDynamic1;
D1 := method.Code;
foo := FooDynamic2;
D2 := method.Code;
end;
{ TFoo }
procedure TFoo.FooDynamic1;
begin
end;
procedure TFoo.FooVirtual1;
begin
end;
// [00450630] TBase
00450600 38 06 45 00 46 06 45 00 04 00 00 00 A0 10 40 00
~~~~~~~~~~~ Offset = -48: 00450638
00450610 BC 39 40 00 C8 39 40 00 CC 39 40 00 D0 39 40 00
00450620 C4 39 40 00 0C 37 40 00 28 37 40 00 64 37 40 00
00450630 54 09 45 00 58 09 45 00 02 00 FF FF FE FF 4C 09
TBase->^ ^[00450638]
00450640 45 00 50 09 45 00 05 54 42 61 73 65 98 06 45 00
// [00450698] TFoo
00450660 00 00 00 00 00 00 00 00 A0 06 45 00 A8 06 45 00
~~~~~~~~~~~ Offset = -48: 004506A0
00450670 04 00 00 00 E4 05 45 00 BC 39 40 00 C8 39 40 00
00450680 CC 39 40 00 D0 39 40 00 C4 39 40 00 0C 37 40 00
00450690 28 37 40 00 64 37 40 00 C8 09 45 00 58 09 45 00
TFoo->^
004506A0 01 00 FF FF C4 09 45 00 04 54 46 6F 6F 8D 40 00
^004506A0