Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Prozedur aufrufen (https://www.delphipraxis.net/20327-prozedur-aufrufen.html)

hboy 16. Apr 2004 00:18


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:
procedure entgegennehmen(procptr: Pointer);
ok den Pointer über geb ich mit

Delphi-Quellcode:
entgegennehmen(@meineprozedur);
So aber wie ruf ich diese Prozedur am andern ende des Pointers auf und vor allem wie übergeb ich der Parameter ???

PS: Windows kann das ( Siehe EnumWindows( EnumProc: Pointer;..)

Tryer 16. Apr 2004 04:58

Re: Prozedur aufrufen
 
Zuerst brauchst Du eine Deklaration des übergebenen Prozedurtyps:
Delphi-Quellcode:
type
  TMyProc = procedure(const Value: string);
Damit besteht dann die Möglichkeit den übergebenen Pointer auszuwerten:
Delphi-Quellcode:
procedure Entgegennehmen(ProcPtr: Pointer);
var
  MyProc: TMyProc;
begin
  @MyProc := ProcPtr;
  MyProc('42');
end;
MfG,
Tryer

hboy 16. Apr 2004 11:24

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

himitsu 16. Apr 2004 11:50

Re: Prozedur aufrufen
 
Schau mal in der OH, oder hier nach Variant (z.B. Variante Arrays, Variante Typen ...)

maximov 16. Apr 2004 11:59

Re: Prozedur aufrufen
 
Warum nicht gleich...

Delphi-Quellcode:
procedure Entgegennehmen(ProcPtr: TMyProc);
begin
  ProcPtr('42');
end;
??

hboy 16. Apr 2004 12:43

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 ?

hboy 16. Apr 2004 18:17

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);

hboy 16. Apr 2004 18:25

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 16. Apr 2004 18:35

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Windows API" nach "Sonstige Fragen zu Delphi" verschoben.
Geht um Delphi Interna, nicht Windows

hboy 18. Apr 2004 12:16

Re: Prozedur aufrufen
 
hat jemand eine Idee wie ich die parameter übergeb ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr.
Seite 1 von 3  1 23      

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