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?
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:
Nur Sinnvoll, wenn die Funktion mehrmals gebraucht wird
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
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.
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.
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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
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.
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.