Seite 1 von 2
DLL ProcedureReturn ?
Verfasst: 08.04.2010 22:20
von The_Dark_Zim-.-
Hey ho
Wie gibt man aus einer DLL mehrere Werte zurück ?
Bsp. ein Wert dafür das die Procedure erfolgreich war und dann noch ein zwei andere Werte ?
Gruß Zim
Re: DLL ProcedureReturn ?
Verfasst: 08.04.2010 22:23
von ts-soft
Strukturen als pointer zurückgeben wäre eine Idee dazu
Code: Alles auswählen
Structure mystruct
wert1.i
wert2.i
wert3.i
EndStructure
ProcedureDLL bla()
Static result.mystruct
result\wert1 = 4711
result\wert2 = 0815
result\wert3 = #True
ProcedureReturn @result
EndProcedure
; mainprogramm
Define *value.mystruct = bla()
Debug *value\wert1
Debug *value\wert2
Debug *value\wert3
Re: DLL ProcedureReturn ?
Verfasst: 09.04.2010 08:20
von DarkDragon
ts-soft hat geschrieben:Strukturen als pointer zurückgeben wäre eine Idee dazu
Code: Alles auswählen
Structure mystruct
wert1.i
wert2.i
wert3.i
EndStructure
ProcedureDLL bla()
Static result.mystruct
result\wert1 = 4711
result\wert2 = 0815
result\wert3 = #True
ProcedureReturn @result
EndProcedure
; mainprogramm
Define *value.mystruct = bla()
Debug *value\wert1
Debug *value\wert2
Debug *value\wert3
Naja so würde ich das nicht machen. Immerhin kann man dann nicht 2 mal bla aufrufen um 2 verschiedene Inhalte zu bekommen, da die Adresse von result gleich bleibt bei Static. Das macht man mit *result.mystruct = AllocateMemory(SizeOf(mystruct)) üblicherweise oder durch einen Parameter. Wenn er sowieso herausfinden will ob die Operation erfolgreich war, wär das mit den Parametern sogar sinnvoll. Dann kann er ganz normal mit dem Rückgabewert einen Errorcode oder sowas ausgeben und in dem Parameter dann die Werte speichern.
Re: DLL ProcedureReturn ?
Verfasst: 09.04.2010 10:32
von Kaeru Gaman
nicht ganz richtig, mag sein dass die Adresse gleich bleibt, aber das juckt nicht, weil man den Inhalt beliebig anpassen kann.
"traditionell" wäre es so gelöst, im Hauptprogramm einen strukturierten Speicher zu erstellen und den von der DLL befüllen zu lassen, so wie die meisten API-Funktionen das tun.
.... das meintest du wahrscheinlich mit "Parameter" ...
Re: DLL ProcedureReturn ?
Verfasst: 09.04.2010 14:54
von ts-soft
lol
warum soll ich memory allokieren, der dann jedesmal neu allokiert wird und denn dann
wahrscheinlch niemand freigibt. Mit statischen Variablen vermeide globale variablen
und der Inhalt bleibt trotzdem bis zum nächstem Aufruf der Funktion gültig, das ist
das simpelste und effektivste, ansonsten muß ich mir den Speicher als parameter
geben lassen und dort hineinpacken, was aber nicht einem procedurereturn entspricht, wie
die frage hier eben lautet!
Re: DLL ProcedureReturn ?
Verfasst: 09.04.2010 14:57
von DarkDragon
Kaeru Gaman hat geschrieben:nicht ganz richtig, mag sein dass die Adresse gleich bleibt, aber das juckt nicht, weil man den Inhalt beliebig anpassen kann.
Das ist es ja.
Danach zeigen beide auf denselben Speicherbereich und der Inhalt ist somit gleich. Man will aber unterschiedliche Inhalte haben.
@ts-soft: exakt das ist das Problem:
Mit statischen Variablen vermeide globale variablen
und der Inhalt bleibt trotzdem bis zum nächstem Aufruf der Funktion gültig
Nur bis zum nächsten Aufruf und nicht weiter. Sowas mag doch keiner, wozu sollte man sowas gebrauchen, wenn man nichtmal 2 Inhalte parallel betrachten kann? Dann doch lieber das mit dem Parameter wie von mir und dir vorgeschlagen.
Re: DLL ProcedureReturn ?
Verfasst: 09.04.2010 15:05
von Kaeru Gaman
nun, du solltest nicht annehmen, dass es keine Verwendung gäbe für Ergebnisse mit Verfallsdatum.
außerdem wenn wir es mal eher wörtlich nehmen, hat ts tatsächlich völlig recht.
ein ProcedureReturn packt lediglich einen Wert in EAX.
erst durch die außenliegende Zuweisung
MeineVariable = MeineFunktion( Parameter )
weist du den Inhalt von EAX einer außenliegenden Variable zu.
ts hat beschrieben, wie man einen Strukturierten Wert aus der Prozedur raus bekommt.
wenn du draußen was damit weiter machen willst, musst du ihn einer ebenso strukturierten Variablen zuweisen, wie du das mit einfachen Rückgabewerten auch tust.
Re: DLL ProcedureReturn ?
Verfasst: 09.04.2010 15:16
von DarkDragon
Kaeru Gaman hat geschrieben:nun, du solltest nicht annehmen, dass es keine Verwendung gäbe für Ergebnisse mit Verfallsdatum.
Tu ich auch nicht, das war nur die Antwort auf das herablassende Verhalten von ts-soft, der meine Vorschläge auch sofort als unbrauchbar abgestempelt hat.
Kaeru Gaman hat geschrieben:außerdem wenn wir es mal eher wörtlich nehmen, hat ts tatsächlich völlig recht.
Wenn ich den Speicherblock zurückgebe, hab ich auch völlig recht. Das ist prinzipiell dasselbe, nur mit parallelen Speicherblöcken. Ich glaube du vermischst meine 2 Vorschläge.
Code: Alles auswählen
Structure mystruct
a.l
b.i
c.d
EndStructure
; 1. Vorschlag:
ProcedureDLL.i bla()
Protected *result.mystruct
*result = AllocateMemory(SizeOf(mystruct))
If *result
*result\a = 5
*result\b = 3
*result\c = 1.0
EndIf
ProcedureReturn *result
EndProcedure
ProcedureDLL freebla(*object.mystruct)
If *object
FreeMemory(*object)
EndIf
EndProcedure
; 2. Vorschlag:
ProcedureDLL.i blaVorschlag2(*object.mystruct)
*object\a = 5
*object\b = 3
*object\c = 1.0
ProcedureReturn #OK
EndProcedure
Die Vorschläge waren nicht gemischt gedacht. Dadurch stimmt mein 1. Vorschlag ja auch wort wörtlich: Es gibt genauso die Adresse zu den Werten zurück wie ts-softs Vorschlag. Nur dass man es jetzt parallel behandeln kann. Bei Vorschlag 2 kann man nun auch alles parallel behandeln und man muss sich nichtmehr um die manuelle Freigabe kümmern, da man jetzt normale strukturierte Variablen verwenden kann.
Re: DLL ProcedureReturn ?
Verfasst: 09.04.2010 15:16
von ts-soft
Ich muß die im allgemeinen nicht vergleichen, aber wenn dann kann ich sie doch umkopieren.
Re: DLL ProcedureReturn ?
Verfasst: 09.04.2010 16:16
von Deluxe0321
Ich muss hier DarkDragon recht geben. Vorschlag 2 ist wesentlich flexibler!
Ich kann mit diesem Weg z.B auch eine Variable der Struc. prüfen und danach die Rückgabe bestimmen OHNE einen weiteren Parameter in der Procedure.
Code: Alles auswählen
ProcedureDLL.i blaVorschlag2(*object.mystruct)
If *object\a = 5
*object\b = 3
*object\c = 1.0
ProcedureReturn #True
Endif
ProcedureReturn #False
EndProcedure