1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//renvoie l'adresse de la procedure la plus proche de 'UneAdresse"
//parmis celle proposées en paramètre tableau
function TrouverProcedureLaPlusProche(UnPointeur:Pointer;T:array of Pointer):Pointer;
var i,NumElem:Integer;
begin
Result:=0;
NumElem:=Length(T);
if NumElem=0 then Exit;
i:=0;
//On va renvoyer la plus grande adresse, inférieure à l'adresse recherchée
for i:=Low(T) to High(T) do
if ((Cardinal(Result)<Cardinal(T[i])) and (Cardinal(T[i])<Cardinal(UnPointeur)))
then Result:=T[i];
end;
procedure Bouton1; forward;
procedure Bouton2; forward;
{$W+} //<--- obligatoire et à mettre avant notre procedure !
//Force la génération des cadres de piles
procedure Affiche;
var UnPointeur,UneAdresseDeProcedure: Pointer;
begin
//renvoie l'adresse pointée par EBP+4 qui est
//l'adresse d'où à été appelée la procédure
asm // Address := %ReturnAddress%;
mov edx, [ebp+4]; // EDX := (EBP+4)^;
mov UnPointeur, edx; // Address := EDX;
end;
UneAdresseDeProcedure:=TrouverProcedureLaPlusProche(UnPointeur,[@bouton1,@bouton2]);
if UneAdresseDeProcedure=@bouton1 then ShowMessage('Bouton1')
else
if UneAdresseDeProcedure=@bouton2 then ShowMessage('Bouton2')
else
ShowMessage('Pas trouvé qui m''a appelé');
end;
procedure Bouton1;
begin
affiche;
end;
procedure Bouton2;
begin
affiche;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Bouton1;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Bouton2;
end;
initialization
end. |