Seite 1 von 1

Ausführen einer DLL-Funktion

Verfasst: 18.05.2005 16:35
von Lebostein
Nur eine kurze Frage: CallFunctionFast() ist nur dann schneller, wenn ich die Funktionsadresse vorher und einmalig ermittle, oder? Wenn ich CallFunctionFast() in Verbindung mit IsFunction() verwende (1. Beispiel), dürfte es genauso schnell sein wie CallFunction() direkt (2. Beispiel), da ja in beiden Fällen die DLL immer wieder durchsucht wird... oder irre ich mich?

Code: Alles auswählen

Procedure MeineFunktion(param1, param2)
  FunctionID = IsFunction(#Library, "MeineFunktion")
  ProcedureReturn CallFunctionFast(FunctionID, param1, param2)
EndProcedure

Procedure MeineFunktion(param1, param2)
  ProcedureReturn CallFunction(#Library, "MeineFunktion", param1, param2)
EndProcedure

Verfasst: 18.05.2005 17:21
von ts-soft
Normalerweise nur dann, wenn du die FunktionID zwischenspeicherst. Wenn Du nicht alle FunktionID's beim öffnen der DLL ermitteln möchtest, kannst Du es auch so machen:

Code: Alles auswählen

Procedure MeineFunktion(param1, param2)
  Static FunctionID
  If FunctionID = 0 : FunctionID = IsFunction(#Library, "MeineFunktion") : EndIf
  ProcedureReturn CallFunctionFast(FunctionID, param1, param2)
EndProcedure
Nur Sinnvoll, wenn die Funktion mehrmals gebraucht wird

Verfasst: 18.05.2005 18:46
von nicolaus
normalerweise machst du das so das du dir für jede function der dll die du verwenden willst eine avriable anlegst.

dann rufst du bei der initialisierung deines programmes einfach alle funktionen der dll mit IsFunction() auf (natürlich erst OpenLibrary() um die dll zu öffnen) und speicherst deren speicheradresse in die angelegeten variablen.

Code: Alles auswählen

Procedure InitDLLFunctions()
  If OpenLibrary(0,"meine.dll")
    function_1 = IsFunction(0,"Function_1")
  endif
Endprocedure
na ja un nun kannst du mit deinen variablen in denen du ja jetzt die adressen der functionen deiner dll hast mit CallFanctionFast() deine funktionen aus der dll in alle proceduren deines programmes aufrufen ohne das immer wieder in der dll nach der function gesucht werden muß.

hoffe das die erklärung halbwegs verständlich war.

Gruß Nico

Verfasst: 19.05.2005 11:24
von Lebostein
Danke für eure Antworten.

@ts-soft: Sehr elegante Lösung, so werd ich's machen, Danke!

Verfasst: 19.05.2005 11:29
von traumatic
Lebostein hat geschrieben:@ts-soft: Sehr elegante Lösung, so werd ich's machen, Danke!
Ging es Dir nicht um Geschwindigkeit?
Dann ist der Ansatz - noch eine weitere Funktion drumherum
zu bauen - mit Erlaub keine wirklich gute Lösung.

Verfasst: 19.05.2005 11:41
von ts-soft
traumatic hat geschrieben:
Lebostein hat geschrieben:@ts-soft: Sehr elegante Lösung, so werd ich's machen, Danke!
Ging es Dir nicht um Geschwindigkeit?
Dann ist der Ansatz - noch eine weitere Funktion drumherum
zu bauen - mit Erlaub keine wirklich gute Lösung.
Du hast ja Recht, es ist auf jedenfall besser einmalig alle Funktionsadressen zu ermitteln und diese in globalen Variablen zu speichern. Da die Fehlerwahrscheinlichkeit mit vielen globalen Variablen größer wird, bietet es sich an, mit TailBite einen Wrapper zu erstellen, dann sind die globalen Variablen nur noch in der Lib global und nicht im Programm, das diese verwendet.

Meine Lösung von oben ist nur eine Notlösung, wobei ich davon ausgegangen bin, das diese If Abfrage schneller ist, als die Suche der Funktionsadresse.

Verfasst: 19.05.2005 11:50
von traumatic
Ich wollte ja auch gar nichts gegen Deine Lösung sagen, nur an
Geschwindigkeit gewinnt mal halt nicht gerade. ;)

Verfasst: 19.05.2005 12:02
von ts-soft
traumatic hat geschrieben:Ich wollte ja auch gar nichts gegen Deine Lösung sagen, nur an
Geschwindigkeit gewinnt mal halt nicht gerade. ;)
Sollte aber schneller als diese:

Code: Alles auswählen

Procedure MeineFunktion(param1, param2)
  FunctionID = IsFunction(#Library, "MeineFunktion")
  ProcedureReturn CallFunctionFast(FunctionID, param1, param2)
EndProcedure 
sein. Habs ich aber nicht getestet. :)

Verfasst: 19.05.2005 13:15
von Lebostein
Mir ging es nur darum, nicht bei jedem Funktionsaufruf die DLL zu durchsuchen bzw. wenn dann nur einmalig. Und das funktioniert ja mit dem Code ordentlich.

Verfasst: 19.05.2005 15:57
von nicolaus
dann kannst du das auch so machen wie ich es geschrieben hatte (mach ich immer so) das du beim programmstart (initialisierung) die global angelegeten variablen mit IsFunction() "füllst" und somit im restlichen code deines programmes nur noch die variablen (in denen ja die adresse der function aus der dll steht) bei CallFunctionFast() verwenden mußt. das ist denke ich schon mal wesentlich schneller gerade wenn du ne dll mit vielen functionen hast und diese auch nutz.

gruß nico