Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi procedur in dll um Parameter erweitern? (https://www.delphipraxis.net/72345-procedur-dll-um-parameter-erweitern.html)

ts_abc 28. Jun 2006 21:35


procedur in dll um Parameter erweitern?
 
Hallo,

ich möchte neu Parameter zu einer bestehenden Procedur in einer DLL hinzufügen, dabei aber die Kompatibilität der alten Aufrufweise erhalten.

Nun habe ich mir gedacht ich hänge die Parameter vordefiniert an.
Delphi-Quellcode:
// alte Procedur

procedure Test(prm1, prm2, prm3: Pchar); stdcall;
begin
...
end;

// neu mit angehängten Parametern

procedure Test(prm1, prm2, prm3: Pchar; prm4: Boolean = False; prm5: Boolean = True); stdcall;
begin
...
end;

exports
  Test;

begin
end.
Nur klappt das nicht so recht, da wenn ich test nun mit den alten Parametern aufrufe bekommt prm4 und prm5 nicht die Vordefinierten werte. Gibt es dafür irgendeine Lösung oder muss ich wirklich eine neu procedur einfügen, wäre nicht so super.

Gruß Thomas

Olli 28. Jun 2006 22:41

Re: procedur in dll um Parameter erweitern?
 
Und warum machst du es nicht wie es eben üblich wäre?

Delphi-Quellcode:
// "Neue" Funktion ("alte" kopiert und neue Parameter angefügt)
procedure TestEx(prm1, prm2, prm3: Pchar; prm4, prm5: Boolean); stdcall;
begin
...
end;

// "Alte" Funktion (ruft die "neue" mit den vorgegebenen hinzugekommenen Parametern auf)
procedure Test(prm1, prm2, prm3: Pchar); stdcall;
begin
  procedure TestEx(prm1, prm2, prm3, False, True);
end;

exports
  Test,
  TestEx;

begin
end.
So bleibst du kompatibel und kannst neue Funktionalität hinzufügen.

Sinnvoller wäre es allerdings, wenn du den Pointer zu einer Struktur als einzigen Parameter hättest und das erste Member dieser Struktur die Größe wäre. So könntest du je nach Größe der Struktur unterscheiden welche "Version" deiner Funktion der Aufrufer gerade aufrufen will. Wenn du das nicht machst, mußt du immer wieder "Ex" an den Namen anfügen oder deine Funktionsversionen durchnummerieren.

Nach einer Weile könnte das etwas unübersichtlich werden :drunken:

ts_abc 28. Jun 2006 23:25

Re: procedur in dll um Parameter erweitern?
 
Hallo Olli,

erstmal danke für deine schnelle Antwort.

Zitat:

Nach einer Weile könnte das etwas unübersichtlich werden ...hicks...
Genau das war auch mein erster Gedanke bei der Sache, darum wollte ich es auf diese art versuch damit ich den Namen beibehalten konnte. Der Aufruf mit der alten art klappt auch soweit aber warum die neuen vordefinierten Parameter nicht genau den wert erhalten den ich vorgebe ist mir schleierhaft. Könnte das mit stdcall zusammen hängen da von rechts nach links eingelesen wird. :? Werd nun wohl doch in den sauren Apfel beißen müssen. :cry:

Gruß Thomas

SirThornberry 28. Jun 2006 23:31

Re: procedur in dll um Parameter erweitern?
 
die standardwerte die du dort angibst sind nur für den Compiler. Wenn du also irgendwo innerhalb der DLL diese Funktion aufrufen würdest und nicht alle Parameter angibst, so sorgt der compiler dafür. Der Compiler schreibt also für dich sozusagen die Standardwerte für den Aufruf hin. Da außerhalb der DLL aber die Standardwerte der compilierten DLL gar nicht existieren bzw. sichtbar sind wird da auch nix übergeben

CK_CK 28. Jun 2006 23:50

Re: procedur in dll um Parameter erweitern?
 
Sag' mal, warum machst du das nicht via Überladung (overload)?

Oder geht das bei dlls nicht? (bitte nicht schlagen *duck*)

Schönen Abend noch,

Olli 28. Jun 2006 23:50

Re: procedur in dll um Parameter erweitern?
 
Zitat:

Zitat von ts_abc
Der Aufruf mit der alten art klappt auch soweit aber warum die neuen vordefinierten Parameter nicht genau den wert erhalten den ich vorgebe ist mir schleierhaft.

Siehe SirThornberry's Kommentar!

Zitat:

Zitat von ts_abc
Könnte das mit stdcall zusammen hängen da von rechts nach links eingelesen wird. :? Werd nun wohl doch in den sauren Apfel beißen müssen. :cry:

Jain. Mit der Richtung hängt es zumindest nicht zusammen! Aber stdcall erzwingt, da ja der Aufgerufene den Stack aufräumen muß, daß die Anzahl der Parameter stimmt. Angenommen du deklarierst die Funktion beim Importieren so, daß sie 3 statt 5 Parameter annimmt, so holt sich die aufgerufene Funktion dennoch 5 Parameter vom Stack, ob's dir gefällt oder nicht. Außerdem werden danach auch 5 Parameter vom Stack entfernt. Im Endeffekt bedeutet das, daß dein Stack nicht mehr ausbalanciert ist, womit du einen nicht unwesentlichen Beitrag zur Instabilität deines Programms leisten kannst :mrgreen:

Olli 29. Jun 2006 00:03

Re: procedur in dll um Parameter erweitern?
 
Zitat:

Zitat von CK_CK
Sag' mal, warum machst du das nicht via Überladung (overload)?

Oder geht das bei dlls nicht? (bitte nicht schlagen *duck*)

Doch! Wer BDS 2006 Enterprise gewonnen hat, muß auch mit der Schelte klarkommen ...

overload ist eine compiler-gesteuerte Abmachung zwischen Programmierer und Programmiersprache. Da man eine DLL in verschiedensten Sprachen schreiben und aus verschiedensten Sprachen ansprechen können muß, siehst du vermutlich das Problem.

Übrigens: bei cdecl könnte ein Mechanismus ähnlich overload durchaus funktionieren, aber ob man das dann als überladen deklarieren würde ist mir jetzt nicht ganz geläufig. Es wäre also möglich eine C-Funktion mit variabler Parameterzahl korrekt aufzurufen - aber eben nur, weil der Aufrufer den Stack aufräumt. In dem Fall ist die Abmachung zwischen Programmierer und Programmiersprache zweitrangig, weil alle Verantwortung immer auf Seiten des Aufrufers liegt. Bei stdcall gibt es eine Art Kooperation.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 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 by Thomas Breitkreuz