Autor | Thema: Header Dateien | | Datum:16.07.02 12:10 
(mail@stschnell.de) | |
Hallo Community,
habe mal eine Frage zu Header Dateien:
Ist es erforderlich, wenn ich eine Funktion in einer Header Datei definiert habe und diese im Code aufrufe, die dazugehörige DLL via UseDLL vorher einzubinden?
Arbeite gerade mit Frank seiner ProSpeed.DLL, hier trat gerade dieser Fall auf. Ohne UseDLL trat bei einem Befehl ein ExceptionError auf, mit UseDLL lief alles wunderbar. Andere Befehle wiederum funktionieren wunderbar. Bin mir nicht im klaren darüber ob dies vielleicht eine Fehlfunktion von Profan ist, oder ein Schnittstellenproblem zwischen DLL und Profan, oder sonst irgendein Fehler. Hat jemand von Euch eine Idee oder ein ähnliches Problem gehabt?
Tschüss
Stefan
|
| | Datum:16.07.02 12:44 
(joerse@gmx.de) | |
Hallo Stefan,
Die Dll muß immer mit Usedll aufgerufen werden, egal ob aus Headerdateien oder nicht.
Nur bei Dlls die schon im Speicher sind spielt es keine große Rolle.
Es ist höchstens eine Frage sauberer Programmierung.
Windows zählt sozusagen mit und schmeißt Dlls erst aus dem Speicher wenn
kein Programm mehr auf die Dll zugreift. Deswegen auch Freedll.
Gruß
Jörg
|
| | Datum:16.07.02 12:58 
(rgh-soft@t-online.de) | |
Das mit dem USEDLL ist kein Fehler, sondern hat so seine Richtigkeit. Bei den Windowsfunktionen (Windows-API) benötigt man kein USEDLL, da diese DLLs bereits im Speicher sind.
Bei allen anderen DLLs benötigt man dann zwingend ein USEDLL, wenn die DLL zwischen den Aufrufen Daten speichert und sich Dinge merken muß. Das ist bei der PROSPEED.DLL der Fall. Aber auch sonst würde ich immer ein USEDLL vorschlagen, wenn ein- und dieselbe DLL im Programm mehrmals genutzt wird. Das spart nämlich eine Menge Zeit, da die DLL dann im Speicher ist, und nicht erst geladen wird, wenn der Aufruf kommt.
Hintergrund:
Was passiert beim Aufruf (egal, ob über Header, DEF, @External oder @Call), wenn die DLL nicht mit USEDLL geladen wurde? Die DLL wird von der Festplatte in den Speicher geladen und ggf. initialisiert. Der windowsinterne Aufrufzähler der DLL wird erhöht, also von 0 auf 1 gesetzt. Dann wird die Funktion aufgerufen. (Würde die Funktion jetzt Daten eines vorherigen Aufrufs erwarten, gäbe es einen Crash.) Anschließend wird der Zähler wieder um 1 reduziert. Ist er dann auf 0, wird die DLL wieder entladen.
Was passiert, wenn sie vorher schon mit USEDLL geladen wurde? Da die DLL schon im Speicher ist, entfällt das Laden von der Festplatte und initialisiert ist sie auch schon. Der Zähler wird hochgesetzt (jetzt von 1 auf 2), die Funktion aufgerufen und der Zähler wieder zurückgesetzt. Da er nun wieder auf 1 ist, bleibt der Speicher der DLL erhalten und die DLL bleibt im Speicher.
Die Zeitersparnis ist gewaltig!
Nach letztem Gebrauch derDLL sollte man sie dann mit FREEDLL wieder entfernen. Der Zähler geht um 1 zurück auf 0 und die DLL wird aus dem Speicher entfernt.
Gruß
Roland
|
| | Datum: 16.07.02 21:18 
(schmidts@flat2serv.de) | |
Unnützer Nachtrag:
Befindet sich die DLL bereits im Speicher, dann wird sie lediglich in den Adressraum der Anwendung gespiegelt. Bei NT4 konnte man so Trojaner einschleusen, in dem man z.B. eine geänderte PROSPEED.DLL vor der eigentlichen Anwendung geladen hat. Diese DLL hatte dann dieselben Schnittstellen wie PROSPEED, aber einen eigenen Code.
|
|
|