AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi procedur in dll um Parameter erweitern?
Thema durchsuchen
Ansicht
Themen-Optionen

procedur in dll um Parameter erweitern?

Ein Thema von ts_abc · begonnen am 28. Jun 2006 · letzter Beitrag vom 29. Jun 2006
Antwort Antwort
ts_abc

Registriert seit: 22. Sep 2003
20 Beiträge
 
Delphi 10 Seattle Professional
 
#1

procedur in dll um Parameter erweitern?

  Alt 28. Jun 2006, 21:35
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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#2

Re: procedur in dll um Parameter erweitern?

  Alt 28. Jun 2006, 22:41
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
  Mit Zitat antworten Zitat
ts_abc

Registriert seit: 22. Sep 2003
20 Beiträge
 
Delphi 10 Seattle Professional
 
#3

Re: procedur in dll um Parameter erweitern?

  Alt 28. Jun 2006, 23:25
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.

Gruß Thomas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: procedur in dll um Parameter erweitern?

  Alt 28. Jun 2006, 23:31
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von CK_CK
CK_CK

Registriert seit: 31. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: procedur in dll um Parameter erweitern?

  Alt 28. Jun 2006, 23:50
Sag' mal, warum machst du das nicht via Überladung (overload)?

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

Schönen Abend noch,
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#6

Re: procedur in dll um Parameter erweitern?

  Alt 28. Jun 2006, 23:50
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 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.
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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#7

Re: procedur in dll um Parameter erweitern?

  Alt 29. Jun 2006, 00:03
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:58 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