AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi CreateProcess > WaitFor..."komplett geladen" > Kill
Thema durchsuchen
Ansicht
Themen-Optionen

CreateProcess > WaitFor..."komplett geladen" > Kill

Ein Thema von SISven · begonnen am 24. Mai 2004 · letzter Beitrag vom 28. Mai 2004
Antwort Antwort
Seite 1 von 2  1 2      
SISven

Registriert seit: 15. Okt 2003
10 Beiträge
 
#1

CreateProcess > WaitFor..."komplett geladen" &g

  Alt 24. Mai 2004, 08:45
Tschuldigung für den "tollen" Titel - mir fiehl nix Besseres ein.

Mein Ziel:
Ich möchte ca. 15.000 Dateien sequentiell mit der zugehörigen 'exe' öffnen. Ist die Anwendung
komplett gestartet soll sie auch gleich schon wieder geschlossen werden. Ist ein Fehler beim
Öffnen dieser Datei aufgetreten, soll dieser mitgeloggt werden.
Das Ganze soll eine Art "FileChecker" für Datensicherungen auf CD sein. Es soll also auf korrupte
Dateien überprüft werden.

Wat soll ma sonst machen, wenn man kein anderes BackUp mehr hat. Dumm
gelaufen!!!

WENN IHR EINEN ANDEREN LÖSUNGSWEG KENNT ALS ALLE DATEIEN ABKLAPPERN - DANN HER DAMIT!!!

Meine Probleme:

1. Wie kriege ich mit ob die gestartete Anwendung fertig geladen ist und "keine" CPU-Auslastung
mehr hervorruft?

2. Wie komme ich an event. Fehlermeldungen von z.B. Word, Excel, Acrobat,...u.s.w. ran?
z.B.: "Die Datei ist beschädigt...bla,bla,bla."

Mein bisheriger Ansatz:

CreateProcess(...AppName und FileName...);

Delphi-Quellcode:
        repeat

          iReturn := MsgWaitForMultipleObjects(1,
                                               ProcessInfo.hProcess,
                                               FALSE,
                                               1000,
                                               QS_ALLEVENTS);

          if iReturn <> (WAIT_OBJECT_0) then
            Application.ProcessMessages;

        until iReturn = (WAIT_OBJECT_0);
Auf Events warten und selbst PostMessage(WM_CLOSE) oder sowas senden, wenn die Anwendung "oben" ist.

Tja - und für das Fehlerabfangen hab ich noch gar keinen blassen Schimmer. Schön wärs natürlich wenn die eigentliche Fehlermeldung der Anwendung erst gar nicht angezeigt wird.


Meine teuflischste Vorstellung ist überhaupt gar nichts sichtbar zu machen. Also die Anwendung auch nicht anzeigen. Wenn sowas ginge - dat wär schon der Hammer!


OS: Win 2000/XP Pro (sollte auf beiden laufen - muss aber net)
Dev: Delphi 7.0 Pro
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: CreateProcess > WaitFor..."komplett geladen"

  Alt 25. Mai 2004, 19:01
Moin SISven,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Für die Prüfung, ob die Anwendung vollständig gestartet ist, solltest Du Dir mal die Funktion WaitForInputIdle anschauen.
Voraussetzung: Die zu prüfende Anwendung ist keine Konsolenanwendung.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
SISven

Registriert seit: 15. Okt 2003
10 Beiträge
 
#3

Re: CreateProcess > WaitFor..."komplett geladen"

  Alt 25. Mai 2004, 19:45
Danke für's "Herzliche Willkommen"!

WaitForInputIdle habe ich auch schon ausprobiert. Laut "msdn" wäre das ja genau das was ich brauche. Allerdings klappt das nicht. Ich vermute mal das der aktuelle ProzessHandle, in meinem Beispiel..

ProcessInfo.hProcess ... hier nicht ausreicht. Man wird wohl das Handle von dem gerade aktiven Fenster der Anwendung brauchen. Aber wie kommt man da ran?

Wenn jede Anwendung eine Message schicken würde, sobald sie im Idle Zustand ist wär ja alles in Butter. Dann könnte ich ja in meiner RepeatUntil-Schleife auf eine ganz bestimmte Message warten.

Aber ich versuchs doch noch mal mit "WaitForInputIdle" - vielleicht hab ich ja irgendwas falsch gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: CreateProcess > WaitFor..."komplett geladen"

  Alt 25. Mai 2004, 19:50
Wenn du die orginal-Dateien noch hast würde ich dir empfehlen die Originaldatei komplett mit der Zieldatei (backup) zu vergleichen. Also Quelldatei laden, dann zieldatei laden und prüfen ob beide gleich groß sind, ist dies der fall dann als nächstes alle bytes durchgehen und prüfen ob diese auch identich sind. Einfach ein programm öffnen halte ich nicht für sinnvoll denn bei beschädigten jpegs kommt es nicht zwangsläufig zum fehler beim öffnen, jedoch wird das bild fehlerhaft dargestellt
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Ratte

Registriert seit: 12. Dez 2003
Ort: Erfurt
345 Beiträge
 
Delphi 2005 Personal
 
#5

Re: CreateProcess > WaitFor..."komplett geladen"

  Alt 25. Mai 2004, 19:53
Hi,

das Handle kriegst du mit findwindow, aber SirThornberry hat recht. Evt. solltest du sogar die Dateien byteweise vergleichen. Du könntest auch das Microsofttool Windiff aufrufen.

Ratte
Schiffsratte der U.S.S. Delphipraxis, Laderaum 4538
BUSH:= TTerminator.create;
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#6

Re: CreateProcess > WaitFor..."komplett geladen"

  Alt 25. Mai 2004, 20:11
ja, würde auch bit für bit vergeleichen vorschlagen. dann erkennt man zwar keine von vornherein (also schon auf der festplatte kaputten daten), aber du kannst ziemlich sicher (eigentlich so sicher wie es irgend geht) sein, dass deine daten auf der cd nicht anders sind als die auf der festplatte
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
SISven

Registriert seit: 15. Okt 2003
10 Beiträge
 
#7

Re: CreateProcess > WaitFor..."komplett geladen"

  Alt 25. Mai 2004, 23:29
Ich hab keine original Dateien mehr. Ich will nur aus einer Menge gegebener Dateien ermitteln welche davon im Eimer sind.

Also mit bit bzw. byteweisem Vergleich is hier nix.

Bin trotzdem für alle Alternativen offen!
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#8

Re: CreateProcess > WaitFor..."komplett geladen"

  Alt 26. Mai 2004, 15:26
falls du wirklich viel schrott hast, wäre natürlich der test, ob sich die datei öffnen lässt, eine möglichkeit die kaputten auszusortieren. was nicht öffnet, ist futsch. aber es is noch nicht gesagt, ob sich nicht auch manchmal zerstörte dateien öffnen lassen, wo dann hinterher nur irgendwelche werte zerstört sind.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
SISven

Registriert seit: 15. Okt 2003
10 Beiträge
 
#9

Re: CreateProcess > WaitFor..."komplett geladen"

  Alt 26. Mai 2004, 16:48
Das ist schon klar, dass ich damit keine 100%ige Sicherheit habe. Ich habe aber wenigstens einen groben Anhaltspunkt über den Zustand der meisten Dateien.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: CreateProcess > WaitFor..."komplett geladen"

  Alt 26. Mai 2004, 20:00
Moin SISven,

Du könntest ja mal versuchen gezielt zu ermitteln, welcher ExitCode von dem Prozess zurückgegeben wird, wenn die Daten nicht gelesen werden können, und dann mit GetExitCodeProcess prüfen, ob die Datei Ok ist oder nicht.
Vorab aussieben könntest Du die richtig beschädigten aber schon, indem Du alle Dateien mittels XCOPY schon einmal kopierst.
Mit dem Parameter /C würde dann auch im Fehlerfalle das Kopieren fortgesetzt werden. Dann müsstest Du Dir nur noch die Fehlermeldungen in eine Datei umleiten, um gezielt auslesen zu können, welche nicht kopiert werden konnten.
Der Aufruf könnte also z.B. so aussehen:

Code:
xcopy <QUELLE> <ZIEL> /C 2>c:\temp\errorlog.txt
Weitere eventuell nützliche Parameter dafür kannst Du Dir ja noch heraussuchen.

Die 2 vor dem > sollte alle Fehlermeldungen in die Datei umleiten (mit einer 1 wären es die Standardmeldungen)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:35 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