![]() |
Warum stützt mein Programm mit dynamischer DLL ab?
Hallo
Ich will in meinem Programm eine DLL dynamisch laden. Das funktioniert alles. Doch wenn ich das Programm beenden kommt dann immer die Fehlermeldung: "Anwendungsfehler! Zugriffsverletzung an Adressee bla bla...." Ich habe versucht im OnClose mit : if Hauptansicht.CSDLLHandle <> 0 then FreeLibrary(Hauptansicht.CSDLLHandle); den Handle zu beenden. Aber ob mit oder ohne dieses Zeile verbessert sich nichts. Wo könnte der Fehler liegen? Die DLL habe ich selber geschrieben. Die Funktionen der DLL "funktionieren" Wenn ich versuche ein 2x die gleiche DLL zu öffnen gibt es auch eine Fehlermeldung. Eigentlich müsste der Handele ja freigegeben und neu geöffnet werden ? Hier ein kleiner Auschnitt beim laden der DLL:
Delphi-Quellcode:
[edit=sakura] [delphi]-Tags, Leeeerzeilen entfernt. Mfg, sakura[/edit]
if OpenDialog1.Execute then
begin if Hauptansicht.CSDLLHandle <> 0 then FreeLibrary(Hauptansicht.CSDLLHandle); Hauptansicht.PfadChecks:=OpenDialog1.FileName; Hauptansicht.CSDLLHandle := LoadLibrary(PChar(Hauptansicht.PfadChecks)); if Hauptansicht.CSDLLHandle <> 0 then begin FuncPtr := GetProcAddress(Hauptansicht.CSDLLHandle,'DLLCSCheck'); FuncPtr := GetProcAddress(Hauptansicht.CSDLLHandle,'Abgleich'); if FuncPtr = nil then begin showMessage('Die DLL enthält keinen Abgleich!'); end; if FuncPtr <> nil then begin @Berechnung := FuncPtr; end; [edit=sakura] Personality auf Delphi Win32 gesetzt. Mfg, sakura[/edit] |
Re: Warum stützt mein Programm mit dynamischer DLL ab?
Hallo.
Kann es sein, dass du Zeiger auf Funktionen deiner Library z.B. in irgendeinem event handler benutzt, nachdem du die Library bereits entladen hast? Grüße vom marabu |
Re: Warum stützt mein Programm mit dynamischer DLL ab?
Hallo marabu
Sorry aber so gut bin nicht und verstehe deine Aussage deshalb nicht. Wie meinst du das genau?
Delphi-Quellcode:
Gruss
Hier ein ausschnitt aus der DLL:
uses SysUtils, Classes, DLLLizCheck in 'DLLLizCheck.pas'; function Abgleich(DD:PChar; DatGr: Longint):PCHar; export var intAdr :Longint; begin if ((DatGr <=32768) AND (DatGr >0)) then begin intAdr :=$0010; DD[intAdr]:= Char(intB1); result:=DD; end; end; function Inhalt(A:Integer):String;export begin if A=2 then Result:='E0000000'; end; Function DLLCSCheck(A:PCHar):PChar;export begin Result :=CheckCSDLL(A); end; exports Abgleich, Inhalt, DLLCSCheck; begin end. Aurus [edit=sakura] [delphi]-Tags, Leeeeeerzeilen im Code entfernt. Mfg, sakura[/edit] |
Re: Warum stützt mein Programm mit dynamischer DLL ab?
Hallo Aurus,
in deinem ersten Code-Beispiel hast du dir eine Funktionsadresse in die Variable FuncPtr geholt und reichst die Adresse sogar noch weiter. Stellst du sicher, dass nach dem Entladen der Library keine dieser Zeigervariablen weiter verwendet wird? Es würde unweigerlich zu einer Zugriffsverletzung kommen. Übrigens kannst und solltest du deine Code-Beispiele im Beitragseditor als Delphi-Code kennzeichnen (der große Button in der Werkzeugleiste). Grüße marabu |
Re: Warum stützt mein Programm mit dynamischer DLL ab?
Meinst du die Variable "FuncPtr" ?
PS Ich kann nicht auf den Quellcode-Button klicken. Vermutlich weil ich Javascript oder sonst was deaktiviert habe. |
Re: Warum stützt mein Programm mit dynamischer DLL ab?
Zitat:
Und ja er meint FuncPtr. Die Funktion darf nicht mehr benutzt werden, nach dem die Bibliothek mit FreeLibrary freigegeben wurde. |
Re: Warum stützt mein Programm mit dynamischer DLL ab?
Sobald ich den Handle mit FreeLibrary freigegeben habe benutze ich keine Funktionen mehr aus der DLL.
|
Re: Warum stützt mein Programm mit dynamischer DLL ab?
Ich denke doch. Stelle sicher, dass die dynamisch ermittelten Funktionsadressen allesamt in globalen Variablen gehalten werden, setze die Zeiger beim Entladen der Bibliothek alle auf nil und prüfe vor jeder Verwendung der Zeiger auf Assigned(FuncPtr).
marabu |
Re: Warum stützt mein Programm mit dynamischer DLL ab?
@Aurus: Nutze in Zukunft bitte die [delphi]-Tags zur Darstellung von Code. Die obigen Beiträge habe ich entsprechend angepasst.
...:cat:... |
DP-Maintenance
Dieses Thema wurde von "sakura" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Programmieren allgemein ist für Fragen die nicht zu Delphi, C++, C# sind |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz