![]() |
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:
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.
procedure Add(A,B: Integer; var C: Integer);
asm ADD EAX,EDX end; function Euler: Integer; begin Result := Round(Exp(1)); end; Mein Ansatz bisher war wie folgt:
Delphi-Quellcode:
Aufrufen tue ich das ganze dann wie folgt:
procedure DoSomething(Method: Pointer);
begin //... asm CALL [Method] end; //... end;
Delphi-Quellcode:
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.
DoSomething(@Add);
DoSomething(@Euler); MfG |
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; |
AW: Anonyme methode als Parameter übergeben
Cool, danke!
Probier ich nachher mal aus! mfG |
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 22:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz