Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mitbekommen wenn eine DosKonsole geschlossen wird. (https://www.delphipraxis.net/34182-mitbekommen-wenn-eine-doskonsole-geschlossen-wird.html)

corgan 18. Nov 2004 20:16


Mitbekommen wenn eine DosKonsole geschlossen wird.
 
Hallo

Ich bastel gerade an einem kleinem Konverter um MP3 Files nochmal zu komprimieren.
Dazu benutze ich die lame.exe

Ich habe also eine Liste mit MP3 Files, die ich in einer Schleife nacheinander komprimieren möchte.
Das Problem dabei ist jetzt, das sobald ich mit folgender Function die komprimierung gestartet habe, nicht mitbekomme, wann das Dos Fenster schlossen wird, um mit der nächsten Datei zu beginnen.

Hab die function hier im Forum gefunden:
Delphi-Quellcode:
function RunProcessGetHandle(const FileName: String): HWND;

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
  begin
    TList(lParam).Add(Pointer(hWnd));
    Result := True;
  end;

var
  SI: TStartupInfo;
  PI: TProcessInformation;
  List: TList;
  ProcessId: DWORD;
  I: Integer;
begin

  Result := 0;
  List := TList.Create;
  try
    FillChar(SI, SizeOf(TStartupInfo), 0);
    SI.cb := SizeOf(TStartupInfo);
    // SI.dwFlags := STARTF_USESHOWWINDOW;
    // SI.wShowWindow := SW_HIDE;
    if CreateProcess(nil, PChar(FileName), nil, nil, False, 0, nil, nil, SI, PI) then
    begin
      WaitForInputIdle(PI.hProcess, INFINITE);
      if EnumWindows(@EnumWindowsProc, Longint(List)) then
      begin
        for I := 0 to List.Count - 1 do
        begin
          GetWindowThreadProcessId(Longint(List.Items[I]), ProcessId);
          if PI.dwProcessId = ProcessId then
          begin
            Result := Longint(List.Items[I]);
            Break;
          end;
        end;
      end;
      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);
    end;
  finally
    List.Free;
  end;

end;
Ich bekomme jedenfalls kein Handle zu einem DosFenster, das ich überprüfen könnte, um mit der nächsten datei zu beginnen.

Aufruf:
Delphi-Quellcode:
..
lamestring := extractfilepath(paramstr(0))+'lame.exe ' + _lamefiles + ' ' + _lameop ;
label13.Caption := inttostr(RunProcessGetHandle(lamestring));
..
Weiß jemand, wie ich die function umschreiben muss, um mitzubekommen wenn die konsole geschlossen wird ?

danke
gruss Corgan

Sprint 18. Nov 2004 23:39

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.
 
Bei einem Konsolenprogramm ist es besser, wenn du auf mit Hilfe der ProcessId bzw. ProcessHandle wartest, bis das Programm fertig ist. (WaitForSingleObject)
Oder du leitest die Ausgabe gleich um. Link

corgan 19. Nov 2004 08:43

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.
 
Zitat:

Zitat von Sprint
Bei einem Konsolenprogramm ist es besser, wenn du auf mit Hilfe der ProcessId bzw. ProcessHandle wartest, bis das Programm fertig ist. (WaitForSingleObject)
Oder du leitest die Ausgabe gleich um. Link

hallo

ich will ja die ausgabe garnicht umleiten, da ich bis jetzt nur functionen dazu gefunden habe, die lediglich den letzten inhalt zurückgeben, aber nicht den zur laufzeit. :(

Ich habe mir mal die Hilfe zu (WaitForSingleObject) angesehen, aber so richtig werde ich daraus nicht schlau.

phXql 19. Nov 2004 09:01

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.
 
kannst du nich direkt die lame.dll aufrufen? dann sparst du dir den umweg über die DOS-Prompt...

corgan 19. Nov 2004 09:15

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.
 
Zitat:

Zitat von phXql
kannst du nich direkt die lame.dll aufrufen? dann sparst du dir den umweg über die DOS-Prompt...

hallo

naja, ich habe es nicht geschafft, als Quelldatei eine MP3 zu konvertieren.
Mit der Lameenc.dll konnte ich nur WAVs konvertieren.
Oder hast du da ne Lösung ? :)

phXql 19. Nov 2004 14:49

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.
 
ich hab noch nie was mit der lame.dll gemacht, ich weiss nur, dass es sie gibt ;)

Sprint 19. Nov 2004 15:10

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.
 
Zitat:

Zitat von corgan
Ich habe mir mal die Hilfe zu (WaitForSingleObject) angesehen, aber so richtig werde ich daraus nicht schlau.

Delphi-Quellcode:
  if CreateProcess(...) then
  begin
    WaitForSingleObject(PI.hProcess, INFINITE);
    ShowMessage('Fertig');
  end;

Garfield 20. Nov 2004 09:44

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.
 
Ich habe für eine ähnliche Aufgabe die zweite Variante von Swiss Delphi Center genommen und ein wenig angepasst. Im Prinzip wird der Prozess gestartet und in bestimmten Abständen nachgesehen, ob der Prozess beendet wurde. Im Beispiel wird sleep(50) verwendet. Da die Konvertierung länger dauert, kann man den Intervall auf 200 - 500 ms hochsetzen.

corgan 20. Nov 2004 09:59

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.
 
Zitat:

Zitat von Garfield
Ich habe für eine ähnliche Aufgabe die zweite Variante von Swiss Delphi Center genommen und ein wenig angepasst. Im Prinzip wird der Prozess gestartet und in bestimmten Abständen nachgesehen, ob der Prozess beendet wurde. Im Beispiel wird sleep(50) verwendet. Da die Konvertierung länger dauert, kann man den Intervall auf 200 - 500 ms hochsetzen.

GENAU DAS HABE ICH GESUCHT !!
danke garfield


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