Announcement

Collapse
No announcement yet.

DLL wird nicht wirklich entfernt?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DLL wird nicht wirklich entfernt?

    Hallo,

    ich hab ein Programm welches eine DLL läd Handle := LoadLibrary('dll.dll')
    ganz unpecktakulär doch wenn ich jetzt ein FreeLibrary(handle) mache wird 1. nicht der komplette speicher wieder freigegeben und 2. Wird in der DLL auch nicht die ExitProc procedure aufgerufen! Sie wird wie in der Hilfe beschrieben beim laden der DLL umgebogen und in der Procedure wieder zurück gebogen! Allerdings hält der Debugger nie in der Procedure an! Aber die DLL scheint wirklich entladen zu werden(hab ich durch einen Bug im Program festgesellt)

    kann man das irgenwie ordentlich debuggen? So das man sieht wo der Speicher drauf geht? Oder liegt das daran das Windows den Speicher nicht richtig frei gibt?

    Bye

    Marcel Schmied

  • #2
    Hallo,

    man sollte sich schon an die von Win32 aufgestellten Regeln halten (auch wenn Borland in der Hilfe stellenweise etwas anderes schreibt).
    Der offizielle Weg führt über DLL_PROCESS_DETACH:
    <pre>
    procedure DLLEntryPoint(dwReason: DWord);
    begin
    case dwReason of
    DLL_PROCESS_ATTACH: OpenSharedData; // DLL wird geladen
    DLL_PROCESS_DETACH: CloseSharedData; // DLL wird entladen
    end;
    end;

    begin
    // DLL wird in den Adressraum geladen -> DLLEntryProc aktivieren
    DllProc := @DLLEntryPoint;
    // die DLLEntryProc auch gleich aufrufen
    DLLEntryPoint(DLL_PROCESS_ATTACH);
    end.
    </pre>
    Die Delphi-Unit <i>system.pas</i> deklariert die Variable <b>DLLProc</b>, über die sich die DLL bestimmte Informationen über Windows-Systemereignisse holen kann. Dazu muss die DLL nur einen eigenen Handler dieser Variable zuweisen.

    P.S: Das vollständige Beispiel ist in meinem Buch <i>Delphi Win32-Lösungen</i> im DLL-Kapitel zu finden

    Comment


    • #3
      Danke Andreas,

      das funktioniert so! Hast du ein Buch geschrieben in dem mal die Verwaltungs maschine von Delphi und win32 gut erklärt ist? Zum Beispiel die Speicherverwaltung! Denn ich hab festgestellt das der TOpenDialog 16DLL's läd dabei 1.1MB verschlingt und die nie wieder frei gibt! Die Bücher die direkt zu Delphi dazu sind enthalten da ja nur spärliche oder gar keine informationen dazu (siehe DLL)!<p>
      Bye<p>
      Marcel Schmie

      Comment


      • #4
        Hallo,

        ja - mein Buch <i>Delphi Win32-Lösungen</i> geht überwiegend in die Tiefe des Systems (vom Message Handling über Prozesse, Threads und Fibers bis hin zu DLLs). Man muss allerdings bei Win32 zwischen reservierten Speicher (es stehen für jede Anwendung 4 GByte zur Verfügung!) und tatsächlich committeten Speicher (der RAM belegt) unterscheiden. Im Buch sind verschiedene Wege beschrieben, wie man im eigenen Programm dies nachvollziehen kann

        Comment

        Working...
        X