Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Absturz beim Programmstart unter Window NT (https://www.delphipraxis.net/5975-absturz-beim-programmstart-unter-window-nt.html)

mjenke 25. Jun 2003 10:01


Absturz beim Programmstart unter Window NT
 
Hallo, alle miteinander!

Ich habe ein dringendes Problem, bei dem ich auf Eure Hilfe hoffe:
Mein Programm läuft auf Rechnern mit verschiedenen Betriebssystemen und unter verschiedenen Profilen. Auf einem XP-Rechner läuft es einwandfrei. Auf einem Windows98SE-Rechner läuft es einwandfrei. Unter NT passiert folgendes:
- Lokaler Admin: Programm läuft einwandfrei
- Benutzer mit eingeschränkten Rechten: Programmabsturz mit Dr. Watson beim Programmstart.

Also mit anderen Worten: es scheint sich wohl um eine Rechtesache zu handeln. Soweit so gut...

Das eigentliche Problem ist folgendes: Es gibt eine Methode FormCreate, die gewisse Dinge ausführt, und eine Methode FormActivate, die ebenfalls gewisse Dinge ausführen soll.

Ich habe mir Messages anzeigen lassen, um nachzuvollziehen, wie weit die Methoden durchlaufen werden, bevor es zum Absturz kommt. Das Ergebnis war wie folgt:
Die FormCreate-Methode wird reibungslos durchlaufen. Jede Anweisung wird ausgeführt, und auch die allerletzte Meldung erscheint noch. Als nächstes müsste er nun eigentlich in die FormActivate-Methode einsteigen. Als allererste Anweisung steht dort ein showMessage. Diese Meldung wird aber schon nicht mehr angezeigt, sondern Dr. Watson meldet sich zu Wort...

Der Absturz geschieht also ZWISCHEN FormCreate und FormActivate. Hat jemand eine Ahnung, woran so etwas liegen könnte?

Als weitere Info: Es gibt DBTable-Objekte, Query-Objekte etc, die allerdings zunächste nicht aktiv sind. Die werden erst zu einem späteren Zeitpunkt zur Laufzeit geöffnet. Ausserdem existiert ein Session-Objekt, das bereits zur Entwurfszeit auf Active gesetzt ist...

Wäre super, wenn jemand helfen könnte!!!

:?
Matthias

sakura 25. Jun 2003 10:21

Poste mal bitte den Quelltext aus der DPR Datei zwischen begin und end. Das könnte weiterhelfen.

...:cat:...

r_kerber 25. Jun 2003 10:33

Greifst du irgendwie auf die Registry zu?

mjenke 25. Jun 2003 10:41

@sakura:

Hier der Quelltext aus der dpr zwischen begin und end:
Code:
begin
  Application.Initialize;
  Application.Title := 'Datenpflegeprogramm ATV-Branchenführer 2001';
  Application.CreateForm(TfrmATVMain, frmATVMain);
  Application.CreateForm(TdatModul, datModul);
  Application.CreateForm(TfrmKategorien, frmKategorien);
  Application.CreateForm(TfrmDBOptions, frmDBOptions);
  Application.CreateForm(TfrmLaender, frmLaender);
  Application.CreateForm(TdatModulAusgabe, datModulAusgabe);
  Application.CreateForm(TfrmSuchDialog, frmSuchDialog);
  Application.CreateForm(TfrmAboutBox, frmAboutBox);
  Application.CreateForm(TfrmLaufendeNummern, frmLaufendeNummern);
  Application.CreateForm(TfrmKorrekrurbelicht, frmKorrekrurbelicht);
  Application.CreateForm(TfrmQRListe, frmQRListe);
  Application.CreateForm(TfrmAdrEdit, frmAdrEdit);
  Application.CreateForm(Tform99, form99);
  Application.Run;
end.

@r_kerber:
Ja, ich greife in FormActivate auf die Registry zu. Allerdings komme ich gar nicht soweit, dass das Registry-Objekt erzeugt wird. Ich fliege vorher schon raus.
Der Beginn der FormActivate sieht folgendermassen aus:
Code:
procedure TfrmATVMain.FormActivate(Sender: TObject);
var regDBOptions : TRegistry;
begin
   showMessage('Begin Activate');    // Debug, M. Jenke, 24.06.03
   If Not isInitialized Then
Ich komme aber, wie gesagt, nicht mal bis zu showMessage...

:?
Matthias

sakura 25. Jun 2003 10:45

Zwischen dem Create und dem Activate werden alle folgenden Module und Formulare erstellt. In deren Create-Ereignissen können auch fatale Fehler auftreten.
Delphi-Quellcode:
  Application.CreateForm(TdatModul, datModul);
  Application.CreateForm(TfrmKategorien, frmKategorien);
  Application.CreateForm(TfrmDBOptions, frmDBOptions);
  Application.CreateForm(TfrmLaender, frmLaender);
  Application.CreateForm(TdatModulAusgabe, datModulAusgabe);
  Application.CreateForm(TfrmSuchDialog, frmSuchDialog);
  Application.CreateForm(TfrmAboutBox, frmAboutBox);
  Application.CreateForm(TfrmLaufendeNummern, frmLaufendeNummern);
  Application.CreateForm(TfrmKorrekrurbelicht, frmKorrekrurbelicht);
  Application.CreateForm(TfrmQRListe, frmQRListe);
  Application.CreateForm(TfrmAdrEdit, frmAdrEdit);
  Application.CreateForm(Tform99, form99);
...:cat:...

Christian Seehase 25. Jun 2003 11:24

Moin Matthias,

wenn den schon Dr. Watson kommt, dann wird dabei üblicher Weise auch eine Log Datei erstellt, und ausserdem steht auf dem Dr. Watson Fenster auch immer ein Fehlercode.
Wie die Logdatei genau heisst fällt mir gerade nicht ein. Such' am Besten mal im Systemverzeichnis (und darunter) nach *.log.
Der Name müsste zu erkennen sein.

Eventuell steht auch etwas im Eventlog.

Luckie 25. Jun 2003 11:31

Schreibst du in HKLM in die Registry?

mjenke 25. Jun 2003 11:39

Ja. In HKEY_LOCAL_MACHINE/Software etc..
Aber ist das zum Zeitpunkt des Absturzes nicht gleichgültig? Da ich ja noch gar nicht auf die Registry zugreife...
:?:
Matthias

r_kerber 25. Jun 2003 11:42

Bist Du Dir da sicher?. Setze doch mal einen Breakpoint an diese Stelle (unmittelbar bevor Du das Registry-Objekt erzeugst).

Luckie 25. Jun 2003 11:46

Änder das mal und schreib in HKCU. In HKLM hat nur der Admin Schreibrechte.

Was willst du denn in der Registry speichern und ist es unbedingt nötig dies in HKLM zu tun?

mjenke 25. Jun 2003 12:00

@r_kerber:
Innerhalb von FormActivate passieren mehrere Dinge, bevor das Registry-Objekt erzeugt wird. Aber keine einzige Anweisung innerhalb der FormActivate wird ausgeführt!

@Luckie:
Die Einträge liegen in HKLM, damit sie für jeden eingeloggten User gleichermassen zur Verfügung stehen. Allerdings würde ich - wenn ich denn überhaupt soweit käme - nur lesend auf die Schlüssel zugreifen. Per OpenKeyReadOnly.

:|
Matthias

mjenke 25. Jun 2003 12:15

Noch eine Zusatzinfo:

Aus der Registry wird ein Pfad ausgelesen, der vom Benutzer an irgendeiner Stelle gesetzt werden kann...

Ich habe jetzt, um die Registry auszuschliessen, mal komplett den gesamten Code, der irgend etwas mit Registry-Zugriffen zu tun hat, auskommentiert (auch die Deklaration des TRegistry-Objektes) und den Pfad fest eingegeben. Der Absturz bleibt der gleiche...

:(
Matthias

r_kerber 25. Jun 2003 12:18

Jetzt mußt Du feststellen, ob und welches CreateForm den Absturz hervorruft. In der dpr Breakpoint setzen und debuggen.

sakura 25. Jun 2003 12:56

Hast Du Dir jetzt eigentlich meinen Beitrag zu Herzen genommen und Messages zwischen die einzelnen Creates gesetzt? Diese werden alle ausgeführt, bevor das Hauptform aktiviert wird, damit ist der Fehler in einem der anderen Forms bzw. Module zu suchen!

...:cat:...

mjenke 25. Jun 2003 13:08

@r_kerber und sakura:

Ach, Ihr habt ja so recht... Ich konnte das Problem jetzt sehr stark eingrenzen und die Form finden, in deren Create das Programm abschmiert. Warum es dort abstürzt, weiss ich noch nicht, aber tatsächlich konnte ich das Create ersteinmal auskommentieren, da der Dialog zur Zeit nicht benutzt wird. Das drängendste Problem ist damit beseitigt.

Vielen Dank Euch zwei! Der Hinweis war Gold wert!!!

:D
Matthias

sakura 25. Jun 2003 13:11

Sag ich doch :mrgreen: Lade doch mal den Code des Create-Events hier hoch, vielleicht können wir das ja auch noch lösen ;-)

...:cat:...

mjenke 26. Jun 2003 06:59

Hi, sakura!

Der Witz bei diesem Dialog ist, dass er keinen OnCreate-Code besitzt. Hier passiert ohnehin erstaunlich wenig (und glücklicherweise wird der Dialog - wie es nun aussieht - nicht mehr benötigt). Es gibt ein Query-Objekt und ein Datasource-Objekt. Ansonsten nur ein paar Buttons und ein DBGrid. Nichts dramatisches eigentlich.

Zum Reinschauen hier trotzdem mal der Code...

Code:
unit uKorrekrurbelicht;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, DBGrids, StdCtrls, Buttons, Db, DBTables;

type
  TfrmKorrekrurbelicht = class(TForm)
    DBGrid1: TDBGrid;
    BitBtn1: TBitBtn;
    SpeedButton1: TSpeedButton;
    DataSource1: TDataSource;
    Query1: TQuery;
    BitBtn2: TBitBtn;
    CheckBox1: TCheckBox;
    Label1: TLabel;
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  frmKorrekrurbelicht: TfrmKorrekrurbelicht;

implementation

uses udatModulAusgabe, uLfdNummer, uQRListe, udatModule, uATVConsts;

{$R *.DFM}

procedure TfrmKorrekrurbelicht.SpeedButton1Click(Sender: TObject);
begin
   with Query1 do
   begin
      with SQL do
      begin
        Clear;

        Add('SELECT DISTINCT D.LaufendeNummer, D.SortierBegriff, D.BearbeitungsStatus, D2.VerbindungsArt, D2.VerbindungsDaten, D3.Drucktext ');
        Add('FROM '+Firmen +' D, '+FirmenAnschriften+' D1, '+FirmenVerbindungen+' D2, '+FirmenDrucktexte+' D3 ');
        Add('WHERE ((D.BearbeitungsStatus = 1.0) OR (D.BearbeitungsStatus = 2.0)) ');
        Add('AND (D1.FirmaID = D.IDFirma) ');
        Add('AND (D2.FirmaID = D1.FirmaID) ');
        Add('AND (D2.AnschriftID = D1.IDAnschrift) ');
        Add('AND ((D2.VerbindungsArt = 3.0) OR (D2.VerbindungsArt = 4.0)) ');
        Add('AND (D3.FirmaID = D.IDFirma) ');
D2.VerbindungsDaten, D.BearbeitungsStatus');
        If frmLaufendeNummern.RadioButton1.Checked Then
          Add('ORDER BY D.' + SortierBegriff)
        else
          Add('ORDER BY D.' + LaufendeNummer);

     end;
     open;

   end;

   frmQRListe.Show;
   If not CheckBox1.Checked Then
     frmQRListe.Quickrep1.Print
   else
     frmQRListe.Quickrep1.Preview;

   frmQRListe.Close;

end;

procedure TfrmKorrekrurbelicht.FormShow(Sender: TObject);
begin
  Label1.Caption := IntToStr(datModulAusgabe.qryMKorrekturFirmenAnschriften.RecordCount);
end;

end.
:)
Matthias

sakura 26. Jun 2003 07:22

Einfach mal versuchen...
Code:
procedure TfrmKorrekrurbelicht.FormShow(Sender: TObject);
begin
  [color=#ff0000]try[/color]
    Label1.Caption := IntToStr(datModulAusgabe.qryMKorrekturFirmenAnschriften.RecordCount);
  [color=#ff0000]except
  end;[/color]
end;
...:cat:...

Christian Seehase 26. Jun 2003 13:41

Moin Zusammen,

oder so

Code:
procedure TfrmKorrekrurbelicht.FormShow(Sender: TObject);
begin
  [color=#ff0000]try[/color]
    Label1.Caption := IntToStr(datModulAusgabe.qryMKorrekturFirmenAnschriften.RecordCount);
  [color=#ff0000]except
    ShowMessage('HIER');
  end;[/color]
end;
Dann ist klar, dass auch eine Exception erfolgte, und nicht vielleicht zufällig nichts passiert ist.

sakura 26. Jun 2003 13:49

Wenn, dann ganz...
Code:
procedure TfrmKorrekrurbelicht.FormShow(Sender: TObject);
begin
  [color=#ff0000]try[/color]
    Label1.Caption := IntToStr(datModulAusgabe.qryMKorrekturFirmenAnschriften.RecordCount);
  [color=#ff0000]except
    on E: Exception do ShowMessage('Fehler: ' + E.Message);
  end;[/color]
end;
...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 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