AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Externes Programm ausführen

Ein Thema von Willie1 · begonnen am 11. Dez 2017 · letzter Beitrag vom 17. Jan 2018
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Willie1

Registriert seit: 28. Mai 2008
667 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Externes Programm ausführen

  Alt 11. Dez 2017, 10:35
Hallo Delphifreunde/innen,

ich führe Exiftool von Phil Harvey aus, um die vollständigen Metadaten eines Bildes zu erhalten. Exiftool ist ein Programm ohne Oberfläche. Ich starte Exiftool aus meiner Anwendung, Exiftool legt eine temporäre Datei an, die ich dann mit meiner Anwendung einlese und anzeige. Das hat bis jetzt gut funktioniert, seit dem letzten Windows-Update nicht mehr. Unter Vista läuft es immer noch!
Zum Ausführen von Exiftool benutze ich diese Routine, nicht von mir wahrscheinlich hier aus dem Forum.
Delphi-Quellcode:
function ExecAndWait(const CommandLine, Parameter: string; SWModus: Word=SW_HIDE) : Boolean;
var
  StartupInfo: Windows.TStartupInfo; // start-up info passed to process
  ProcessInfo: Windows.TProcessInformation; // info about the process
  ProcessExitCode: Windows.DWord; // process's exit code
begin
  // Set default error result
  Result := False;
  // Initialise startup info structure to 0, and record length
  FillChar(StartupInfo, SizeOf(StartupInfo), 0);
  StartupInfo.cb := SizeOf(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow:=SWModus;
  // Execute application commandline
  if Windows.CreateProcess(nil,
                           PChar(CommandLine),
                           nil,
                           nil,
                           False,
                           0,
                           nil,
                           PChar(Parameter),
                           StartupInfo,
                           ProcessInfo) then
  begin
    try
      // Now wait for application to complete
      if Windows.WaitForSingleObject(ProcessInfo.hProcess, INFINITE)
        = WAIT_OBJECT_0 then
        // It's completed - get its exit code
        if Windows.GetExitCodeProcess(ProcessInfo.hProcess,
          ProcessExitCode) then
          // Check exit code is zero => successful completion
          if ProcessExitCode = 0 then
            Result := True
    finally
      // Tidy up
      Windows.CloseHandle(ProcessInfo.hProcess);
      Windows.CloseHandle(ProcessInfo.hThread);
    end
  end
  else
    Showmessage(Format('Fehler:%d - %s!',[GetLastError,SysErrorMessage(GetLastError)]))
end; {ExecAndWait}
Unter Windows 10 nach dem Update liefert sie false zurück.. CreateProcess wird ausgeführt, denn sonst gäbe es eine Fehlermeldung.

Ich weise darauf hin, dass ich ExecAndWait oft benutze auch mit Exiftool, nur hier geht's nicht. Was kann Microsoft geändert haben?
Hat jemand eine Idee, woran das liegen kann.

Gruß Willie.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Externes Programm ausführen

  Alt 11. Dez 2017, 10:41
Du hast doch einen Debugger. False kommt nur zurück wenn entweder WaitForSingleObject oder GetExitCodeProcess fehlschlägt oder der ExitCode ungleich Null ist.

Die ganzen WinApi-Funktionen die einen Boolean zurückgeben würde ich immer mit Win32Check(..) prüfen. Deine Methode wirft dann direkt die passene EOSError -Exception, da musst du nichts mehr mit GetLastError() usw. herauspflücken.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Externes Programm ausführen

  Alt 11. Dez 2017, 11:31
So, wie ich das sehe, ist das Verhalten unter Vista falsch.
GetExitCodeProcess ist ungleich 0, wenn alles korrekt gelaufen ist.
Du prüfst aber auf gleich 0

Aus der Doku von Microsoft:
Zitat:
Return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: Externes Programm ausführen

  Alt 11. Dez 2017, 11:37
Nein, er prüft ProcessExitCode gegen 0, nicht den Rückgabewert der Funktion.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Externes Programm ausführen

  Alt 11. Dez 2017, 12:00
Ja, Sorry.
Ich bin auf den Klassiker reingefallen.

Habe mal meine alten Sourcen durchgesehen.
Der Status könnte an der Stelle noch STILL_ACTIVE sein, auch wenn der Prozess eigentlich beendet ist. Das ist dann ungleich 0.

Deswegen sollte man auch WaitForSingleObject verwendet, wie es hier schon im Source steht. Nutzt man nur GetExitCodeProcess in einer Schleife, kann das eine Endlos-Schleife werden. Zumindest habe ich das bei mir so notiert.
Peter

Geändert von Jasocul (11. Dez 2017 um 12:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Externes Programm ausführen

  Alt 11. Dez 2017, 13:59
Was gibt GetExitCodeProcess denn zurück? False? Oder ist ProcessExitCode ungleich 0? Das solltest du zunächst einmal im Debugger prüfen wie schon erwähnt.

Und wenn du ohnehin eine Meldung bei einem Fehlschlag anzeigst, könntest du das dort auch machen. Ich würde allerdings eher Exceptions verwenden, denn mit der Meldung ist der Fehler ja nicht unbedingt behandelt.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
667 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: Externes Programm ausführen

  Alt 11. Dez 2017, 15:41
Antwort an euch alle:

ich hab's ausprobiert, auch auf einem Laptop mit Windows 10 vor dem letzen Update läuft es, wie gewünscht!
Ich werde euren Ratschlägen folgen und mich dann wieder melden.
Willie.

Geändert von Willie1 (11. Dez 2017 um 15:46 Uhr)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
667 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: Externes Programm ausführen

  Alt 12. Dez 2017, 10:45
Hallo Günther,
ich habe ExecAndWait debuggt. Es wird vollständig durchlaufen, Rückgabewert immer true. Ich habe festgestellt, dass unter Windows 10 nach dem Update die temporäre Datei, die Exiftool mit den Metadaten anlegen soll, nicht erzeugt! Ich benutze die neuste Version Exiftool. Was hat Microsoft da gedreht? Eure Expertise ist gefragt, danke.

Willie.

Geändert von Willie1 (12. Dez 2017 um 10:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von rapante
rapante

Registriert seit: 3. Jun 2009
Ort: OPR
172 Beiträge
 
Delphi 12 Athens
 
#9

AW: Externes Programm ausführen

  Alt 12. Dez 2017, 10:55
Hallo Willie,
wo soll die temporäre Datei denn erstellt werden? Eventuell gibt es hier ein Berechtigungsproblem...

ich hab's ausprobiert, auch auf einem Laptop mit Windows 10 vor dem letzen Update läuft es, wie gewünscht!
Was heißt den VOR dem letzten Update (bzw. danach)? Meinst du das Update auf 1709?
Micha
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#10

AW: Externes Programm ausführen

  Alt 12. Dez 2017, 11:23
Ich würd' ja mal den Wert von ProcessExitCode abfragen. <> 0 heißt Fehler. Der entsprechende Wert gibt eventuell Auskunft darüber, was beim Exiftool schiefgegangen ist, den Fehler würd' ich dann mal beseitigen.

Eventuell mal CommandLine und Parameter ausgeben und auf der Kommandozeile nachschauen, ob dort bereits eine Fehlermeldung erscheint?

Wenn es dort bereits nicht funktioniert, den Fehler beheben und anschließend dann mit dem eigenen Programm das Zusammenspiel erneut testen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    

 

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 07:37 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