![]() |
Prozedur aufrufen
Hallo,
noch jemand wach ? cool. danke. Ich habe folgendes prob: ich will einen Pointer entgegennehmen der auf eine existierende Prozedur zeigt.
Delphi-Quellcode:
ok den Pointer über geb ich mit
procedure entgegennehmen(procptr: Pointer);
Delphi-Quellcode:
So aber wie ruf ich diese Prozedur am andern ende des Pointers auf und vor allem wie übergeb ich der Parameter ???
entgegennehmen(@meineprozedur);
PS: Windows kann das ( Siehe EnumWindows( EnumProc: Pointer;..) |
Re: Prozedur aufrufen
Zuerst brauchst Du eine Deklaration des übergebenen Prozedurtyps:
Delphi-Quellcode:
Damit besteht dann die Möglichkeit den übergebenen Pointer auszuwerten:
type
TMyProc = procedure(const Value: string);
Delphi-Quellcode:
MfG,
procedure Entgegennehmen(ProcPtr: Pointer);
var MyProc: TMyProc; begin @MyProc := ProcPtr; MyProc('42'); end; Tryer |
Re: Prozedur aufrufen
hey cool danke.
kann ich die übergebenen parameter vielleicht auch allgemein halten ( als array ? so dass man alle möglichen Prozeduren mit den entsprechenden Parametern aufrufen kann ? der Format-Befehl nimmt auch so ne array entgegen |
Re: Prozedur aufrufen
Schau mal in der OH, oder hier nach Variant (z.B. Variante Arrays, Variante Typen ...)
|
Re: Prozedur aufrufen
Warum nicht gleich...
Delphi-Quellcode:
??
procedure Entgegennehmen(ProcPtr: TMyProc);
begin ProcPtr('42'); end; |
Re: Prozedur aufrufen
ich speichere die Parameter und rufe die Prozedur nach einem anegegebenen Zeitintervall wieder auf.
Wenns gar nich will werde ich wohl bisschen assemblern müssen ( der die Parameter werden in form eines Stacks in EBP übergeben); dann muss ich eigentlich nur die Werte ( Pointer oder vielleicht sinds auch schon integer oder andere 32bit werte) retten, in ner Array speichern, dann wieder auf den stack pushen und die Prozedur aufrufen ? :roll: Jemand ne Ahnung ob das so geht ? |
Re: Prozedur aufrufen
Delphi Hilfe :warn:
Bei Verwendung der Konventionen pascal, cdecl, stdcall und safecall werden alle Parameter im Stack übergeben. Bei der Konvention pascal werden die Parameter in der Reihenfolge ihrer Deklaration (von links nach rechts) übergeben, so dass der erste Parameter im Stack an der obersten Adresse und der letzte Parameter an der untersten Adresse gespeichert wird. Bei den Konventionen cdecl, stdcall und safecall werden die Parameter in der entgegengesetzten Reihenfolge ihrer Deklaration (von rechts nach links) übergeben, so dass der erste Parameter im Stack an der untersten Adresse und der letzte an der obersten Adresse gespeichert wird. Bei der Konvention register werden maximal drei Parameter in den CPU-Registern übergeben, der Rest im Stack. Die Parameter werden in der Reihenfolge ihrer Deklaration übergeben (wie bei der Konvention pascal). Die ersten drei geeigneten Parameter stehen in den Registern EAX, EDX und ECX (in dieser Reihenfolge). Nur reelle, variante und strukturierte Typen sowie Methodenzeiger- und Int64-Typen sind als Registerparameter ungeeignet. Sind mehr als drei mögliche Registerparameter vorhanden, werden die ersten drei in EAX, EDX und ECX übergeben. Die restlichen Parameter werden in der Reihenfolge ihrer Deklaration im Stack abgelegt. Ein Beispiel: procedure Test(A: Integer; var B: Char; C: Double; const D: string; E: Pointer); |
Re: Prozedur aufrufen
aber wie bring ich jetzt die parameter auf den Stack ?
push EBP ? geht das nicht einfacher ? und muss ich so nicht für jeden typ unterscheiden ? |
DP-Maintenance
Dieses Thema wurde von "Christian Seehase" von "Windows API" nach "Sonstige Fragen zu Delphi" verschoben.
Geht um Delphi Interna, nicht Windows |
Re: Prozedur aufrufen
hat jemand eine Idee wie ich die parameter übergeb ?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 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