フォームが実行時に作成された (または破棄された) ことを知る方法を見つけたいと考えています。これは Delphi または fpc 用です。どうもありがとう
PS: すべてのオブジェクトの情報を取得する方法はありますか?
新しいオブジェクトが実行時に作成された (または破棄された) ことを知らせるイベントが必要です。
オブジェクトが作成または破棄されるたびに発生する組み込みイベントはありません。
私はコード フックを書くのが好きなので、次のユニットを提供します。_AfterConstruction
これにより、メソッドがSystem
ユニットにフックされます。理想的にはトランポリンを使用する必要がありますが、それらを実装する方法を学んだことはありません. 実際のフック ライブラリを使用した場合は、より適切に実行できます。とにかく、ここにあります:
unit AfterConstructionEvent;
interface
var
OnAfterConstruction: procedure(Instance: TObject);
implementation
uses
Windows;
procedure PatchCode(Address: Pointer; const NewCode; Size: Integer);
var
OldProtect: DWORD;
begin
if VirtualProtect(Address, Size, PAGE_EXECUTE_READWRITE, OldProtect) then
begin
Move(NewCode, Address^, Size);
FlushInstructionCache(GetCurrentProcess, Address, Size);
VirtualProtect(Address, Size, OldProtect, @OldProtect);
end;
end;
type
PInstruction = ^TInstruction;
TInstruction = packed record
Opcode: Byte;
Offset: Integer;
end;
procedure RedirectProcedure(OldAddress, NewAddress: Pointer);
var
NewCode: TInstruction;
begin
NewCode.Opcode := $E9;//jump relative
NewCode.Offset := NativeInt(NewAddress)-NativeInt(OldAddress)-SizeOf(NewCode);
PatchCode(OldAddress, NewCode, SizeOf(NewCode));
end;
function System_AfterConstruction: Pointer;
asm
MOV EAX, offset System.@AfterConstruction
end;
function System_BeforeDestruction: Pointer;
asm
MOV EAX, offset System.@BeforeDestruction
end;
var
_BeforeDestruction: procedure(const Instance: TObject; OuterMost: ShortInt);
function _AfterConstruction(const Instance: TObject): TObject;
begin
try
Instance.AfterConstruction;
Result := Instance;
if Assigned(OnAfterConstruction) then
OnAfterConstruction(Instance);
except
_BeforeDestruction(Instance, 1);
raise;
end;
end;
initialization
@_BeforeDestruction := System_BeforeDestruction;
RedirectProcedure(System_AfterConstruction, @_AfterConstruction);
end.
ハンドラーを割り当てるOnAfterConstruction
と、オブジェクトが作成されるたびにそのハンドラーが呼び出されます。
OnBeforeDestruction
イベント ハンドラーの追加については、読者の演習として残しておきます。
そのようなアプローチが良いことだと言っているわけではないことに注意してください。私はあなたが尋ねた直接の質問に答えているだけです。これを使用するかどうかは、自分で決めることができます。私はそうしないことを知っています!
TForm
のイベントを使用OnCreate
して、必要な方法で必要な人に通知します。