Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programm stürzt auf anderen PCs ab (https://www.delphipraxis.net/143145-programm-stuerzt-auf-anderen-pcs-ab.html)

Romensch 10. Nov 2009 19:35


Programm stürzt auf anderen PCs ab
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute!

Ich hab ein Druckserver-Programm programmiert, welches ein Verzeichnis überwacht und automatisch eine PDF-Datei auf dem Standarddrucker ausdruckt (via Ghostprint.exe von Ghostview), wenn diese in dieses Verzeichnis gespeichert wird.

Das Programm wurde auf einem Windows XP Home SP3 Rechner mit Delphi 6 programmiert und funktioniert auf diesem PC einwandfrei.

Der Zielrechner, für den das Programm vorgesehen ist, hat Windows XP Professional installiert.

Das Programm läuft dort nicht, sondern stürzt sofort nach dem Start ab (xy.exe hat ein Problem festgestellt und muss beendet werden.)

Testweise wurde das Programm noch auf einem Vista Rechner mit SP2 und einem virtuellen Windows 98 System gestartet. Es stürzt auch da in beiden Fällen beim Start ab.

Die Ereignisanzeige unter XP und Vista liefert über den Absturz nur irgendwas mit "Fehlerhaftes Modul Kernel32.dll".

Ich hab keinen Plan, woran das liegen könnte. Das Programm wird auf beiden Rechnern unter Administratorkonten ausgeführt, daran kann es nicht liegen.

Habt ihr eine Idee? Ich bin echt ratlos. :(

Hier ist der Programmcode (EDIT: Jetzt auch als Attachment hochgeladen.):
http://pastebin.de/1357

Gruß
Romensch

himitsu 10. Nov 2009 20:05

Re: Programm stürzt auf anderen PCs ab
 
Was ist "direkt nach dem Start"?
versagt schon der (Exe)Loader, weil z.B. irgendwas fehlt
oder dreht irgendwas im Programm durch?

Was ist (in) TDirMonitor?

Globalen Variablen sind böse. (pfad und installdir gehören in den Private-Avschnitt der Form)

Und was mir noch auffiehl:
Wozu glaubst du ist Action und FileName in DirMonitor1Change?
Diese sollte man mal auswerten (denn diese sagen gleich was sich geändert hat ... da muß man dann nicht erst suchen)

PS: kommt es mir nur so vor, oder könnte hier was doppelt bearbeitet werden?
Außerdem könnte es probleme geben, wenn irgendwas noch dabei ist die neue PDF zu speichern, wärend du schon versuchst diese zu drucken.

fatalerror 10. Nov 2009 20:31

Re: Programm stürzt auf anderen PCs ab
 
Zitat:

Zitat von himitsu
Globalen Variablen sind böse. (pfad und installdir gehören in den Private-Avschnitt der Form)

Da sind weitere ganz böse Dinge in diesem Code!

- Inidateien gehören nie ins Programmverzeichnis. ApplicationData
- Eine Fehlerüberprüfung gehört in "jede" Procedure (Dann siehst du auch wo es crasht).

generic 10. Nov 2009 21:05

Re: Programm stürzt auf anderen PCs ab
 
Hi Romensch, willkommen in der DP.

Wir bevorzugen hier, dass alles von dem DP Server kommt.
Um deinen Source hier her zu bekommmen, hast du viele Möglichkeiten.
a) du kopierst den Source hier rein und versiehst ihn mit den Code-Tags
b) du hängst ihn als Attachment an.

Wäre toll wenn du deinen ersten Beitrag editierst und um den Code ergänzt.

Blup 11. Nov 2009 10:39

Re: Programm stürzt auf anderen PCs ab
 
Ist die Ini-Datei nicht vorhanden oder keine Pfade angegeben, sind die entsprechenden Variablen leer.
Dann gibt es hier eine schöne Zugriffsverletzung:
Delphi-Quellcode:
function TForm1.pfruefePfad(tempPfad : string) : string;
begin
  if tempPfad[length(tempPfad)] = '\' then
        result:= tempPfad
  else
    result := tempPfad + '\';
end;

Romensch 11. Nov 2009 15:26

Re: Programm stürzt auf anderen PCs ab
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

Echt ein tolles Forum hier. So schnell so viele Antworten.

Entschuldigung, dass ich den Code per PasteBin geschickt habe, ich wusste nicht, ob das hier gern gesehen ist, wenn man das Forenlayout mit ellenlangen Codes sprengt. Hab's nochmal als Attachment hochgeladen.

Also, ich bin noch ein Anfänger, deswegen sind eure Tipps sehr nützlich. Werd sie nach und nach durchgehen ...

@himitsu
"Direkt nach dem Start" heißt, dass sofort das Fenster von Windows kommt "xy.exe hat ein Problem festgestellt ..." ohne dass man von dem Programm überhaupt etwas zu sehen bekommt.
Normal startet das Programm ja und minimiert sich direkt im Tray und man sieht dort das Symbol. Das ist jedoch auf den 3 Testrechnern nicht der Fall, es stürzt eben sofort ab.
Ob der EXE-Loader nicht geht oder irgendwas im Programm spinnt, kann ich nicht sagen (weiß nicht einmal wirklich, was so ein EXE-Loader ist).

TDirMonitor ist eine zusätzliche Komponente für Delphi, die ich installiert habe, um das Verzeichnis zu überwachen.
Bei Änderungen im Verzeichnis (genauer: neue Datei) wird die Prozedur "DirMonitor1Change" ausgeführt.

Ok, ich werd die globalen Variablen unter "private" deklarieren, kann jedoch nicht erkennen, wie hier der Zusammenhang zwischen dem Absturz auf bestimmten PCs bestehen soll.

Dass ich die PDF-Dateien extra suche, sollte doch eigentlich kein Problem darstellen. Ich will nur sicher gehen, dass wirklich alle PDF in dem Verzeichnis gedruckt werden, z.B. wenn sich was ansammelt solange der Druckserver noch nicht gestartet ist.
Meint ihr ich sollte dann die ganze Prozedur mit "DirMonitor1Change" über Bord werfen und lieber eine Endlosschleife programmieren, die alle 10s oder so das Druckverzeichnis auf PDF Dateien prüft und diese dann druckt?

Wegen den Problemen mit dem Drucken während es noch andere Dateien gibt: das ist eigentlich kein Problem. Auf dem Rechner, auf dem das Programm geschrieben wurde, hat gsprint.exe anstandslos mehrere Dateien gedruckt. Für jede Datei öffnet sich ein DOS-Fenster, d.h. eine eigene Instanz von gsprint.exe

@fatalerror
Wieso soll ich die INI-Datei nicht ins Programmverzeichnis packen? Ich dachte, es ist übersichtlicher, wenn alles zusammen in einem Ordner ist und nicht getrennt auf der Festplatte herumfährt.

Wie kann ich eine Fehlerbehebung in Prozeduren umsetzen? Ich hab während der Entwicklung immer wieder "ShowMessage('Ich tu grad dies und das');" eingebaut, um zu erkennen, ob das Programm auch gerade die richtige Prozedur startet etc.
Auf dem Entwicklungsrechner läuft das Programm ja soweit auch korrekt.

@Blup
Die INI hab ich mit der Programm.exe mitkopiert. Die Pfadangaben waren zu Beginn auf "C:\", da dieser Ordner eigentlich immer vorhanden ist.

EDIT:
Ich hab jetzt mal die "DirMonitor" Prozedur über Bord geworfen und hab die Überwachung einfach mal "zu Fuß" per Timer (Test auf PDF alle 10s) realisiert.
Jetzt läuft das Programm auf dem virteuellen Windows 98 und auf dem Vista Rechner.
Den XP Professional Rechner konnte ich nicht testen, erst morgen auf der Arbeit wieder.
Was lernt man daraus: Man sollte möglichst keine fremden Komponenten verwenden ...

Eure Tipps hab ich trotzdem soweit mal umgesetzt (Variablen im Private Teil). (Neuer Code im Attachment angefügt.)

p80286 11. Nov 2009 16:16

Re: Programm stürzt auf anderen PCs ab
 
Hallo Romensch,

so wie Du den "Absturz" beschreibst, vermute ich den Fehler in der .DPR.
in den meisten Fällen sieht eine .DPR ja so aus:
Delphi-Quellcode:
program COUNTER_TEST;

uses
  Forms,
  counter_test_m in 'counter_test_m.pas' {Form1},
  Counter_test_data in 'Counter_test_data.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
Das Programm wird initialisiert (Form eingerichtet) und mit .Run läuft dann die Eventsteuerung an, die in den meisten Fällen auf einen Mausklick reagiert.

Wenn Dein Programm "selbstätig" nach Änderungen in einem Verzeichnis sucht, wo passiert das denn?
Timer1 kann es nicht sein, da der für die Minimierung zuständig ist.

Gruß
K-H

Romensch 11. Nov 2009 16:40

Re: Programm stürzt auf anderen PCs ab
 
Hallo p80286.

Ich hab deinen Beitrag erst nach der Editierung gelesen.

Der Fehler liegt wohl in der Komponente "TDirMonitor" die ich im Internet heruntergeladen und zusätzlich in Delphi installiert habe.

Diese Komponente kann Verzeichnisse überwachen und z.B. eine Prozedur ausführen, wenn eine Datei hinzukommt. Wie genau das funktioniert, weiß ich nicht, hab ich mir auch nicht angeguckt.

Ich hab die Komponente jetzt aus dem Programm verbannt und benutze jetzt wie du schon angesprochen hast, einen Timer (Timer2).

Danke für eure Hilfe. :)

Gribbelfix 24. Nov 2009 12:58

Re: Programm stürzt auf anderen PCs ab
 
Die TDirMonitor-Komponente funktioniert sehr wohl - das Problem dürfte eher sein, dass hier eine Exception geworfen wird.

Das im Beispiel hinterlegte Verzeichnis 'C:\prueba' wird wohl auch auf Deinem Rechner nicht vorhanden sein...
Wenn Du ein vorhandenes Verzeichnis bei der Komponente hinterlegst funktionierts prima.
Oder Du fängst die Exception ab (-> "No se ha encontrado el directorio" - Verzeichnis nicht gefunden).

Dieses "Monitoring" des Verzeichnisses gefällt mir wesentlich besser als ein dauerndes pollen... :bouncing4:


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