Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Schutzverletzung nach Programmende (https://www.delphipraxis.net/184144-schutzverletzung-nach-programmende.html)

Walter Landwehr 2. Mär 2015 17:03

Schutzverletzung nach Programmende
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, wenn ich mein Programm im Netzwerk auf einem Windows 8.1 pro Rechner beende, kommen die im Anhang beigefügten Meldungen. Im Modul im OnDestroy sind keine Anweisungen mehr, ebenso im Mainformular unter OnClose, OnCloseQuery und OnDestroy habe ich testhalber alle Anweisungen herausgenommen. Die Anwendung schließt sich und nach ca. 2 Sekunden kommen die Meldungen. Hat jemand eine Idee wo man noch suchen könnte.

Danke schon mal im voraus für Eure Hilfe.

himitsu 2. Mär 2015 17:19

AW: Schutzverletzung nach Programmende
 
Also damit kann hier auch keiner was anfangen, da wir nicht wissen was an den Adressen liegt, also bei dir, in deinem Programm, das wir nicht kennen.

Idee: Du nimmst den Debugger und schaust mal, ob der dir mehr sagt.

Alle Adressen, die irgendwas mit 0000???? zu tun haben, deuten start auf nil hin, also daß auf etwas zugegriffen wird, was nicht existiert. (ein nil-Pointer, bzw. nil-Objektzeiger)



PS: Das nächste Mal bitte als Bild(er) anhängen, ober besser noch Strg+C, in diesen Dialogen, und dann im Beitragseditor wieder Strg+V (kopiert als Text).

Dalai 2. Mär 2015 17:22

AW: Schutzverletzung nach Programmende
 
Da wird auf irgendein Objekt zugegriffen, das nicht mehr existiert, jedenfalls deutet darauf die Adresse
Delphi-Quellcode:
nil
hin.

MfG Dalai

Blup 3. Mär 2015 08:28

AW: Schutzverletzung nach Programmende
 
Eine mögliche Ursache sind Formulare die Member vom Typ Interface haben.
Die sollte man möglichst schon beim Schließen auf nil setzen.
Die Formulare werden zwar irgendwann automatisch zerstört, aber zu diesem Zeitpunkt kann auch das Objekt, auf das ein Interface verweist, bereits zerstört sein.
Die automatische Referenzzählung löst dann eine Zugriffsverletzung aus.

Der schöne Günther 3. Mär 2015 08:39

AW: Schutzverletzung nach Programmende
 
Ich könnte mich irren, aber schluckt der normale Delphi-Speichermanager (zumindest beim Herunterfahren) diese Fehler nicht? Wenn der Referenzzähler auf einer bereits freigegebenen Instanz dekrementiert werden soll? Natürlich ist das falsch die Referenzen vorher nicht von Hand auf Nil zu setzen, aber ich meine...

himitsu 3. Mär 2015 08:57

AW: Schutzverletzung nach Programmende
 
Nein, natürlich nicht.

Es wird
Delphi-Quellcode:
IInterface._Release;
"aufgerufen", wenn eine Interface-Variable freigegeben wird, und dafür muß das interne Objekt noch existieren.
Und mit dem Speichermanager hat das nix zu tun.

Der schöne Günther 3. Mär 2015 09:02

AW: Schutzverletzung nach Programmende
 
Ich sehe nur dass ich in einer "normalen" VCL-Anwendung keine Fehlermeldung bekomme, noch nicht einmal im Debugger. Wenn ich nun bspw. "FastMM4" als erstes in die uses der DPR nehme hält er dort an und wirft AVs.

Delphi-Quellcode:
program Project22;

uses
  //FastMM4,
  Vcl.Forms,
  Unit8 in 'Unit8.pas' {Form8};

{$R *.res}

var
   intfRef:   IInterface;
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm8, Form8);
  intfRef := Form8;
  Application.Run;
end.
Delphi-Quellcode:
unit Unit8;

[...]
type
  TForm8 = class(TForm, IInterface)

[...]

himitsu 3. Mär 2015 09:15

AW: Schutzverletzung nach Programmende
 
FastMM ist immer drin, denn das ist seit 2006 integriert.

Und globale Interface-Variablen, auf Interfaces ohne Referenzzählung, denen diese Instanzen egal sind ... wer wundert sich dort?

Wenn du FastMM4 einbindest, dann wird das eventuell freigegeben, bevor diese globale Projekt-Variable freigegeben wird,
während der Standard-Speichermanager in der System.pas liegt.

Und das ist ein Grund, warum ich endlich überall [Weak]-Referenzen haben will,
aber hier (globales intfRef) bist du selber Schuld.

Walter Landwehr 3. Mär 2015 09:46

AW: Schutzverletzung nach Programmende
 
Ich habe bei mir den Fehler gefunden. Und zwar setze ich auf mein Hauptformular die Komponente TAdvOfficeStatusBarOfficeStyler von TMS ein. Auf mein Datenmodul liegt die Komponente TAdvPanelStyler ebenfalls von TMS. Beide Komponenten auf ein Formular geht nicht. Wo kann man denn den TADVPanelStyler noch ablegen damit das Programm richtig ohne Meldung herunterfährt.

Die Einträge in meiner Projektdatei sehen so aus:

Delphi-Quellcode:
  Application.Initialize;
  Application.CreateForm(TdmMain, dmMain);
  Application.CreateForm(TfrmMain, frmMain);
  Application.MainFormOnTaskbar := True;
  Application.Run;

EWeiss 3. Mär 2015 09:53

AW: Schutzverletzung nach Programmende
 
Ich vermute mal gar nicht.
Als alternative müsstest du diese zur Laufzeit (Dynamisch) einbinden.
Ob diese sich aber gegenseitig stören kann ich allerdings nicht mit Bestimmtheit sagen.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 Uhr.
Seite 1 von 2  1 2      

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