AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Exception ''access violation ' beim beenden des Programms
Thema durchsuchen
Ansicht
Themen-Optionen

Exception ''access violation ' beim beenden des Programms

Ein Thema von Kostas · begonnen am 23. Mär 2014 · letzter Beitrag vom 5. Mai 2014
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Exception ''access violation ' beim beenden des Programms

  Alt 23. Mär 2014, 22:19
Starte dass Programm mit dem Debugger und wenn die Exception geworfen wird, dann poppt erst ein Fenster von der IDE auf, da dann auf abbrechen und man befindet sich im Quelltext- oder CPU-Fenster.

Links oben befindet sich idR der Stacktrace, den man dann mal Schritt für Schritt zuruckgeht, bis man an die Stelle im eigenen Code kommt. Dort befindet sich dann die Stelle, die für das Auslösen mittelbar verantwortlich ist.

Meine Vermutung

Der Fehler tritt bei einer MDI Anwendung auf. Kann es sein, dass du das Fenster extra erzeugst, aber zusätzlich auch schon im Hintergrund eine Form-Instanz erstellt wurde (in der .dpr nachschauen).

Diese automatisch erzeugte Instanz wird beim Beenden natürlich entsorgt, aber dabei wird auf etwas zugegriffen, was du mit der manuell erzeugten Form-Instanz schon abgeräumt hast.

Das ist natürlich nur ein Blick durch die Glaskugel, dein geposteter Quellcode war mir einfach zu lang
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (23. Mär 2014 um 22:23 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: Exception ''access violation ' beim beenden des Programms

  Alt 24. Mär 2014, 07:01
Obwohl das von Sir Rufo beschriebene Verfahren vermutlich zum Ziel führt, versagt klassisches Debuggen häufig, vorzugsweise beim Beenden eines Programms. Wenn der Fehler nicht im eigenen Code liegt, dann wird es schwierig. Wir treffen hier auf Seiteneffekte, d.h. Probleme, die deshalb auftreten, obwohl man eigentlich nichts Falsches gemacht hat. Wer hätte z.B. gedacht, das man Probleme beim Beenden bekommt, wenn man Threads mit 'FreeOnTerminate=True' startet?

Andere Fallstricke sind die `Finaliziation` Abschnitte eigener oder fremder Units. Oder irgendein Destruktor, der falsch aufräumt.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#3

AW: Exception ''access violation ' beim beenden des Programms

  Alt 24. Mär 2014, 08:15
...
Meine Vermutung

Der Fehler tritt bei einer MDI Anwendung auf. Kann es sein, dass du das Fenster extra erzeugst, aber zusätzlich auch schon im Hintergrund eine Form-Instanz erstellt wurde (in der .dpr nachschauen).
...
Darauf habe ich geachtet. Das ist definitiv nicht der Fall. Ich hätte erwähnen müssen, wenn ich die Form mit dem ActiveX Control öffne
also das ActiveX Control wird erzeugt, kann ich beenden und erneut aufrufen ohne Probleme. Wenn ich jedoch nach dem öffnen des Forms
auf die Idee komme, das SignPad zu aktivieren zum unterschrieben, und danach die App beenden bei einer MDI-App dann knallts.
Das ActiveX Control macht über die importierte TLB irgend welche DLL aufrufe und die Hardware zu steuern. Doch warum nur beim beenden
einer MDI-App der Fehler auftritt und nicht bei einer VCL-Forms App ist mir sehr schleierhaft.

Im Stacktrace zu suchen ist nicht so einfach denn ich habe keinen Hinweis was es für ein Fehler ist.

Gruß Kostas

P.S. ich werde auch mal das Tool madExcept ausprobieren.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#4

AW: Exception ''access violation ' beim beenden des Programms

  Alt 24. Mär 2014, 09:41
Es gibt ein paar Unterschiede zwischen MDI- und Nicht-MDI-Forms. So wird bei einem MDI-Child beim Close kein Hide sondern nur ein Minimize ausgeführt. Je nachdem was deine Eventhandler so tun wird das im einen Fall ausgeführt und im anderen nicht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#5

AW: Exception ''access violation ' beim beenden des Programms

  Alt 24. Mär 2014, 15:26
Hallo Uwe,

das ist es leider auch nicht. Die Form ist eine Modale Form. Dessen Unit hat eine Methode um die Form zu erzeugen und zeigt sie per ShowModal an.

Delphi-Quellcode:
function StartfrUnterschrift:TModalResult;
begin
  with frUnterschrift do
  begin
    frUnterschrift := TfrUnterschrift.create(Application);
    try
      result := ShowModal;
    finally
      release;
      frUnterschrift:=nil;
    end;
  end;
end;
Die Form beinhaltet also nur das ActiveX Control und zwei drei Buttons. Wenn die Form erzeugt wird und somit auch das ActiveX Control,
und die App wird beendet, passiert nichts. Wenn jedoch die Form erzeugt wird und man die Methode vom ActiveX Control ausführt, kommt
die exception jedoch nur bei MDI-Apps. Mittlerweile habe ich auch madExcept ausprobiert, auch dieses Tool merkt die exception nicht.
Die Exception wird vermutlich in der DLL vom SignPad ausgelöst. Vermutlich wird irgend ein Handle nicht mehr existieren.
Ich werde mal den Hersteller fragen. Ich gehe nicht davon aus der es den Fall kennt, aber fragen kann man ja mal.

Gruß Kostas
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#6

AW: Exception ''access violation ' beim beenden des Programms

  Alt 24. Mär 2014, 16:52
Delphi-Quellcode:
  with frUnterschrift do
  begin
    frUnterschrift := TfrUnterschrift.create(Application);
    try
      result := ShowModal;
    finally
      release;
      frUnterschrift:=nil;
    end;
  end;

Das tut aber jetzt schon weh!
Ich habe jetzt auch keine Lust auszuprobieren, was da wirklich passiert, aber lös doch bitte mal das with auf...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#7

AW: Exception ''access violation ' beim beenden des Programms

  Alt 24. Mär 2014, 18:10
Delphi löst ein WITH gerne so auf:
Delphi-Quellcode:
function StartfrUnterschrift:TModalResult;
var
  AutomatischGenerierteVariable: TfrUnterschrift;
begin
  //with frUnterschrift do
  AutomatischGenerierteVariable := frUnterschrift;
  begin
    frUnterschrift := TfrUnterschrift.create(Application);
    try
      result := AutomatischGenerierteVariable.ShowModal;
    finally
      AutomatischGenerierteVariable.release;
      frUnterschrift:=nil;
    end;
  end;
end;
Und jetzt mag gern jemand raten, was da nun passiert.

Und wozu gibt es da überhaupt eine globale Variable "frUnterschrift", wo die ja scheinbar nicht außerhalb benutzt wird, oder etwa doch?


Delphi-Quellcode:
function StartfrUnterschrift: TModalResult;
begin
  with TfrUnterschrift.Create(Application) do
  begin
    try
      Result := ShowModal;
    finally
      Free;
    end;
  end;
end;
Beim Release wird das Free nicht sofort ausgeführt, sondern verzögert "irgendwann" später mal,
was auch gerne Probleme erzeugt und vorallem beim Focus ist uns das schon schmerzhaft auf die Füße gefallen.

Und das "Start" im Namen stimmt auch nicht wirklich, denn das Fenster wird erzeugt (gestartet), verarbeitet (ShowModal) und wieder beendet (Release/Free).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.112 Beiträge
 
Delphi 12 Athens
 
#8

AW: Exception ''access violation ' beim beenden des Programms

  Alt 24. Mär 2014, 19:39
Die Variable "frUnterschrift" ist die Formvariable die die Form repräsentiert, wird von Delphi erstellt.

Ihr habt recht. Das With ist völlig überflüssig gewesen. Ich verwende dennoch das With wie angezeigt
da ich meist vor dem ShowModal irgend welche Initialisierungen mache und nach dem ShowModal übergebe ich
die Rückgabewerte. Das With verwende ich damit ich die Formvariable nicht jedes mal angeben muss.
Bis Dato hatte ich damit auch nie Probleme. Diesem Methodenrumpf habe ich mir als Vorlage abgelegt und
verwende sie tausendfach. In diesem Fall wo nichts initialisiert wird und nicht zurückgegeben wird ist es
völlig unnötig.

Das Create im With mache ich bewusst nicht mehr. Damit hatte ich schon massive Probleme. Wenn ich z.B. über einen
qualifizierten Bezeichern arbeiten muss habe ich keinen Zugriff auf die Formvariable da die Form im With erzeugt wird.
Es gab noch mehr Probleme, ich kann mich aktuell nicht an einen Fall erinnern.

Delphi-Quellcode:
function StartfrUnterschrift: TModalResult;
begin
   with TfrUnterschrift.Create(Application) do
   begin
     try
       Result := ShowModal;
     finally
       Free;
     end;
   end;
end;
Gruß Kostas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 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