| Autor |
Beitrag |
Ja-Pa
      
Beiträge: 458
Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
|
Verfasst: Mo 19.09.05 18:52
Hallo,
mal eine nur programmiertechnische Frage und kein Problem:
Wenn ich mit meinem Hauptprogramm auf eine DLL zugreife, und dort eine Prozedur x starte, weist diese einer Variablen y innerhalb der DLL einen Wert zu.
Nun rufe ich in meinem Programm eine zweite Prozedur auf, die mit Variable y rechnet.
Meine Frage ist nun: Wird y gespeichert, oder bei jedem Aufruf einer Prozedur in der DLL neu initialisiert?
Wie ist das, wenn mehr als ein Programm die DLL verwendet? Kann Programm b einen Wert auslesen, der von Programm a gespeichert wurde? Schließlich werden DLLs doch nur einmal in den Speicher geladen, oder?
Wäre interessant, wenn das jemand weiß.
Viele Grüße,
Ja-Pa
_________________ Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
|
|
rochus
      
Beiträge: 416
Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
|
Verfasst: Di 20.09.05 09:22
Hi,
Das kommt immer ganz darauf an, wie du deine DLL lädst:
Wird deine DLL statisch dazu geladen, dann kannst du den Wert in y speichern und beim nächsten Aufruf der Funktion sollte dein Wert auch noch da drin stehen.
Wird die DLL hingegen dynamisch dazugeladen und auch wieder freigegeben, wenn sie nicht mehr benötigt wird, dann geht der Wert, den du in y gespeichert hast, auch verloren.
Wenn mehrere Anwendungen die DLL nutzen, kannst du dennoch nicht die Daten über die DLL schicken. Jeder Prozess bekommt "seine" DLL, die "frisch" ist und nichts mit anderen Prozessen zu tun hat.
Gruß
_________________ Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Di 20.09.05 12:56
Solange die dll im speicher ist und nicht mit FreeLibrary entfernt wird und die Variable Y global in der dll deklariert ist, kannst du sie benutzen und sie behält immer den letzen wert. (d.h. sie wird nicht neu initialisiert)
eine Dll wird in windows zwar nur einmal geladen, aber alle änderungen beziehen sich nur auf die jeweilige dll im prozess. es sei denn die dll ist im shared memory geladen, dann haben alle prozesse zugriff auf die selbe instanz
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
wdbee
      
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: Di 20.09.05 13:49
Früher war es so, dass eine DLL nur einmal in den Speicher geladen wurde. Damals konnte eine DLL deshalb auch für IPC (Interprozesskommunikation) verwendet werden. Unter NT, 2k und XP wird eine DLL in der Regel für jeden Prozess erneut separat in den Speicherraum des Prozesses geladen, der sie anfordert. Es existieren dann also viele Instanzen der DLL gleichzeitig. Damit ist eigentlich der Grund für den Einsatz einer DLL entfallen und für IPC lässt sich das auch nicht mehr verwenden. Ausnahme sind DLLs die in den Shared Memory geladen werden.
Wer nur prozessübergreifende Variablen verwenden will kann das aber auch bequemer haben. Mit einer Suche nach IPC (hier unter Suchwörter) findet sich ein Beitrag von mir (Unit zur Interprozesskommunikation...), bei dem eine Unit vorgestellt wird, die Delphi-Objekte in den Shared Memory legt. Alle Quellen sind dabei und es gibt auch eine kleine Beispielanwendung dazu.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Di 20.09.05 13:56
wdbee es ist auch heute noch so das eine dll nur einmal geladen wird. dafür sind dlls da, sie sind nicht fü IPC gedacht. wenn teile einer dll geändert werden werden sie für einen bestimmten prozess neu geladen.
der code ansich wird von windows aber nur einmal geladen wenn man ihn nicht nachwer wieder ändert
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 20.09.05 13:59
Um es mal vollständig zu machen: Eine DLL wird nur einmal physisch in den Speicher geladen. Wird sie erneut von einem Prozess geladen, dann wird sie nur in den Adressbereich des entsprechenden Prozess eingebelendet. Und so lange sie noch von mindestens einem Prozess geladen ist, wird sie auch nicht physisch aus dem Speicher entfernt.
|
|
wdbee
      
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: Di 20.09.05 14:06
Wenn das stimmt, dann erklärt mir mal, warum DLL-globale Variablen im Speicherbereich jedes Prozesses separat vorhanden sind. Wer trennt denn da Programmspeicher und Datenspeicher?
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Di 20.09.05 14:09
ja wdbee so ist das nunmal, jede page kann bei änderung neu geladen werden.
wenn also ne variable geändert wird wird die page mit der variable für den prozess extra geladen der diese ändert.
alle anderen pages (code, resource inbesondere) werden nur einmal physich gladne und von allen prozessen beansprucht.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
wdbee
      
Beiträge: 628
Erhaltene Danke: 1
|
Verfasst: Di 20.09.05 14:22
Wenn das so ist, dann wäre das ein CopyOnWrite-Mechanismus wie er bei Strings auch verwendet wird. Allerdings bin ich mir nicht sicher, dass da wirklich Daten- und Code-Pages getrennt werden. Ich vermute eher, dass eben Pages die geändert werden, für den lokalen Prozess kopiert werden. Also eine Mischlösung, bei der IPC nicht mehr geht aber ungeänderte Teile nur einmal im Speicher gehalten werden müssen. Eine Speicherung in die DLL-Datei auf der Festplatte(siehe Titel) gibt es jedenfalls nicht und im Speicher sind die Variablen privat (prozessspezifisch).
|
|
Ja-Pa 
      
Beiträge: 458
Win XP, Suse 9.3
D1, D3, D5 Std, D7 Pro, D2005 Pers, Kylix 3
|
Verfasst: Di 20.09.05 14:47
Vielen Dank, das hat meine Frage schon beantwortet!
Deine IPC-Unit ist auch sehr interessant und ich werde sie bestimmt mal verwenden können, auch wenn ich in diesem Thread gar nicht an IPC gedacht habe.
Grüße,
Ja-Pa
_________________ Der Autor dieses Textes haftet nicht für Schäden an Soft- oder Hardware
oder Vermögensschäden, die durch das Benutzen des Textes entstehen.
|
|