Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Warum stützt mein Programm mit dynamischer DLL ab? (https://www.delphipraxis.net/69722-warum-stuetzt-mein-programm-mit-dynamischer-dll-ab.html)

Aurus 19. Mai 2006 08:01


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:
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] [delphi]-Tags, Leeeerzeilen entfernt. Mfg, sakura[/edit]
[edit=sakura] Personality auf Delphi Win32 gesetzt. Mfg, sakura[/edit]

marabu 19. Mai 2006 08:21

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

Aurus 19. Mai 2006 08:46

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:
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.
Gruss

Aurus

[edit=sakura] [delphi]-Tags, Leeeeeerzeilen im Code entfernt. Mfg, sakura[/edit]

marabu 19. Mai 2006 09:07

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

Aurus 19. Mai 2006 09:18

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.

jim_raynor 19. Mai 2006 09:32

Re: Warum stützt mein Programm mit dynamischer DLL ab?
 
Zitat:

Zitat von Aurus
Ich kann nicht auf den Quellcode-Button klicken. Vermutlich weil ich Javascript oder sonst was deaktiviert habe.

Dann schreib einfach [.delphi] [/delphi] (ohne den Punkt bei delphi) um deinen Quellcode. Er wird dann wesentlich einfacher Lesbar.

Und ja er meint FuncPtr. Die Funktion darf nicht mehr benutzt werden, nach dem die Bibliothek mit FreeLibrary freigegeben wurde.

Aurus 19. Mai 2006 09:50

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.

marabu 19. Mai 2006 10:02

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

sakura 19. Mai 2006 10:33

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 19. Mai 2006 10:33

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

Olli 19. Mai 2006 10:38

Re: Warum stützt mein Programm mit dynamischer DLL ab?
 
Danke, sakura!

Zitat:

Zitat von Aurus
Delphi-Quellcode:
Hier ein ausschnitt aus der DLL:

  uses
  SysUtils,
  Classes,
  DLLLizCheck in 'DLLLizCheck.pas';


function Abgleich(DD:PChar; DatGr: Longint):PCHar; export
// [...]

function Inhalt(A:Integer):String;export
// [...]

Function DLLCSCheck(A:PCHar):PChar;export
// [...]

exports
  Abgleich,
  Inhalt,
  DLLCSCheck;

begin
end.

Wir haben hier mehrere Probleme.
  1. Inhalt hat einen String-Parameter, aber die entsprechende Unit ist nicht in die DLL eingebunden (für's Memory-Management mit Strings).
  2. Abgleich() und DLLCSCheck() haben verschiedene Parameter, aber im oberen Beitrag steht
    Delphi-Quellcode:
          FuncPtr  := GetProcAddress(Hauptansicht.CSDLLHandle,'DLLCSCheck');
          FuncPtr  := GetProcAddress(Hauptansicht.CSDLLHandle,'Abgleich');
    was in mir doch das Gefühl aufkommen läßt, daß hier dieselbe Funktionspointervariable für verschiedene Funktionspointer benutzt wird/werden könnte.

Aurus, als erstes solltest du immer Funktionstypen erzeugen und dann Variablen dieser Typen benutzen, denen du den jeweiligen Funktionspointer zuweist. Das dient nicht nur der Übersichtlichkeit. Die eine Stackvariable wird dein Code sicher auch noch verkraften ;)

Aurus 20. Mai 2006 20:03

Re: Warum stützt mein Programm mit dynamischer DLL ab?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen.

Ich habe nur probiert die Fehler zu verbessern.
Die angehängte Datei beinhaltet ein Beispiel mit DLL.

Ich öffen die DLL Funktion 1+2 gehen. Wenn ich aber die 3. Funktion teste kommt mal keine Fehlermeldung aber wenn ich danach das Programm schliesse.


Was mache ich falsch?

Falls noch jemand einen unschönen Code sieht bitte nur sagen.


Gruss

Aurus


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz