Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Anonyme methode als Parameter übergeben (https://www.delphipraxis.net/185757-anonyme-methode-als-parameter-uebergeben.html)

Dennis07 4. Jul 2015 16:20

Delphi-Version: XE5

Anonyme methode als Parameter übergeben
 
Hallo,
ich bins mal wieder und ich hab ne frage. Diesmal geht es um anonyme Methoden, die als Parameter einer von mir implementierten Funktion übergeben werden sollen.
Allerdings soll deren Parameterzahl beliebig sein.
Aktuell übergebe ich diese als Pointer meiner Funktion und rufe sie mit dem ASM-Befehl CALL auf.
Das funktioniert auch ganz prima. Nur leider ist ja Inline-Assembly nicht mehr unter x64 erlaubt und so suche ich nach einer geeigneten Alternative. Desweiteren erscheint es mir nicht besonders sauber, nur weil ich nicht weiß wie ich es sonst lösen soll, mitten in ner Funktion eine einzelne ASM-Zeile einzufügen...

Beispiel:
Delphi-Quellcode:
procedure Add(A,B: Integer; var C: Integer);
asm
  ADD EAX,EDX
end;

function Euler: Integer;
begin
  Result := Round(Exp(1));
end;
So, die oben genannten Methoden machen irgendetwas (ist ja jetzt erstmal egal was). Tatsache ist aber, dass sie zwei unterschiedliche Parameterlisten haben und und unterschiedliche typen zurückgeben.
Mein Ansatz bisher war wie folgt:

Delphi-Quellcode:
procedure DoSomething(Method: Pointer);
begin
  //...
  asm
    CALL [Method]
  end;
  //...
end;
Aufrufen tue ich das ganze dann wie folgt:

Delphi-Quellcode:
DoSomething(@Add);
DoSomething(@Euler);
Beifügen sollte ich evl. noch, dass sowohl die eingabeparameter als auch die ausgegebenen Werte nicht weiter von belangen sind. Dass die einzelne Methode also nur "schrott" ausgeben kann, wenn man ihre Parameter nicht definiert, dürfte klar sein.

MfG

Sir Rufo 4. Jul 2015 16:26

AW: Anonyme methode als Parameter übergeben
 
Du kannst alles in eine Standard Anonyme Methode wrappen:
Delphi-Quellcode:
procedure DoSomething( AProc: TProc);
begin
  AProc();
end;

procedure Foo;
begin

  DoSomething(
    procedure
    var
      c: Integer;
    begin
      Add(4,5,c);
    end );

  DoSomething(
    procedure
    begin
      Euler();
    end );

end;

Dennis07 5. Jul 2015 03:32

AW: Anonyme methode als Parameter übergeben
 
Cool, danke!
Probier ich nachher mal aus!

mfG

jaenicke 5. Jul 2015 07:17

AW: Anonyme methode als Parameter übergeben
 
Für unsere Skriptsprache brauchte ich etwas Ähnliches. Dort ging es darum, dass es eine Funktion gibt, die eine DLL-Funktion aufruft und Parameter und Typen der Parameter mitgibt. Diese habe ich dann in ein Array von TVarData gepackt und dieses Array an eine in Assembler geschriebene Funktion übergeben, die dann diese beliebigen Parameter genommen und an die angegebene Funktion übergeben hat. Diese Funktion ist natürlich in Assembler geschrieben, aber das habe ich dann für x86, x64 und ARM umgesetzt.

Eine ähnliche Funktion hat Delphi selbst aber glaube ich auch schon... ich glaube in der Unit Rtti oder so...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz