gpt4 book ai didi

delphi - 在 TWinControl 类上添加属性

转载 作者:行者123 更新时间:2023-12-03 15:16:51 25 4
gpt4 key购买 nike

我想将已发布的属性添加到 TWinControl 中。有没有办法在不需要重新编译基本源代码的情况下做到这一点?

如果没有,有什么方法可以重新编译基本源代码而不用太麻烦?

感谢您的建议...

因新想法而编辑

好吧,我想做的就是尝试覆盖 System.pas 中的类的 _GetMem继承自 TWinControl。为什么 ?因为我会为对象分配一些额外的空间,足以达到一个整数。为什么是整数?因为这样我就可以添加任何指向对象的指针。因此,在 TWinControl 的辅助类上,我可以创建一个 Get an Set 函数来访问该内存空间。很好不是吗?这个怎么做 ?重写 GetMem 过程我可以使用与 FastCode 相同的策略,创建一个指向新过程的跳线。

我现在需要的是了解此内存分配如何使用 InstanceSize 来覆盖它。我正在研究 Delphi 如何做到这一点...为了将其添加到 DFM 上,我将采用相同的方式,我将创建一个到文件管理器的跳线。

有人有在对象中添加新空间的想法吗?我需要重写什么方法?我知道如何做跳线。

再次感谢。

编辑=进化

我认为我做了内存注入(inject)。我需要做更多测试。我刚刚做到了,我现在不关心优化,如果有人想测试它,这里是代码。只需将该单元添加为项目的第一个单元即可。

unit uMemInjection;


interface

uses
Controls;

type
THelperWinControl = class Helper for TWinControl
private
function RfInstanceSize: Longint;
function GetInteger: Integer;
procedure SetInteger(const Value: Integer);
public
property RfInteger: Integer read GetInteger write SetInteger;
end;

implementation

uses
Windows;

procedure SInstanceSize;
asm
call TWinControl.InstanceSize
end;

function THelperWinControl.GetInteger: Integer;
begin
Result := Integer(PInteger(Integer(Self) + (Self.InstanceSize - SizeOf(Integer)))^);
end;

function THelperWinControl.RfInstanceSize: Longint;
begin
Result := PInteger(Integer(Self) + vmtInstanceSize)^;
Result := Result + SizeOf(Integer);
end;

/////////////////////////////////////////////// FastCode ///////////////////////////////////////////////
type
PJump = ^TJump;
TJump = packed record
OpCode: Byte;
Distance: Pointer;
end;

function FastcodeGetAddress(AStub: Pointer): Pointer;
begin
if PBYTE(AStub)^ = $E8 then
begin
Inc(Integer(AStub));
Result := Pointer(Integer(AStub) + SizeOf(Pointer) + PInteger(AStub)^);
end
else
Result := nil;
end;

procedure FastcodeAddressPatch(const ASource, ADestination: Pointer);
const
Size = SizeOf(TJump);
var
NewJump: PJump;
OldProtect: Cardinal;
begin
if VirtualProtect(ASource, Size, PAGE_EXECUTE_READWRITE, OldProtect) then
begin
NewJump := PJump(ASource);
NewJump.OpCode := $E9;
NewJump.Distance := Pointer(Integer(ADestination) - Integer(ASource) - 5);

FlushInstructionCache(GetCurrentProcess, ASource, SizeOf(TJump));
VirtualProtect(ASource, Size, OldProtect, @OldProtect);
end;
end;

/////////////////////////////////////////////// FastCode ///////////////////////////////////////////////


{ THelperWinControl }
procedure THelperWinControl.SetInteger(const Value: Integer);
begin
PInteger(Integer(Self) + (Self.InstanceSize - SizeOf(Integer)))^ := Value;
end;

initialization
FastcodeAddressPatch(FastcodeGetAddress(@SInstanceSize), @TWinControl.RfInstanceSize);


end.

最佳答案

感谢Smasher ,我记得 Delphi 团队如何使用类帮助器和设计技巧向 Delphi 2007 添加属性,而不破坏与 Delphi 2006 的二进制兼容性。

查看此great article通过 Hallvard Vassbotn关于如何做到这一点。

我认为它可以解决您的大部分(如果不是全部)问题。

在文章中查找以下内容:

  • TCustomFormHelper = TCustomForm 的类帮助器
  • FPixelsPerInch 存储黑客
  • 注入(inject)设计时属性
  • 定义流媒体属性

不过,当您从外部世界连接到 TWinControl 时,您必须以自己的方式进行流式传输,但这也是可能的。

--杰罗恩

关于delphi - 在 TWinControl 类上添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2086396/

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