3

フォームが実行時に作成された (または破棄された) ことを知る方法を見つけたいと考えています。これは Delphi または fpc 用です。どうもありがとう

PS: すべてのオブジェクトの情報を取得する方法はありますか?

4

3 に答える 3

6

新しいオブジェクトが実行時に作成された (または破棄された) ことを知らせるイベントが必要です。

オブジェクトが作成または破棄されるたびに発生する組み込みイベントはありません。

私はコード フックを書くのが好きなので、次のユニットを提供します。_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イベント ハンドラーの追加については、読者の演習として残しておきます。

そのようなアプローチが良いことだと言っているわけではないことに注意してください。私はあなたが尋ねた直接の質問に答えているだけです。これを使用するかどうかは、自分で決めることができます。私はそうしないことを知っています!

于 2013-06-11T12:01:05.460 に答える
0

TFormのイベントを使用OnCreateして、必要な方法で必要な人に通知します。

于 2013-06-11T11:03:02.227 に答える