AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Mitbekommen wenn eine DosKonsole geschlossen wird.
Thema durchsuchen
Ansicht
Themen-Optionen

Mitbekommen wenn eine DosKonsole geschlossen wird.

Ein Thema von corgan · begonnen am 18. Nov 2004 · letzter Beitrag vom 20. Nov 2004
Antwort Antwort
corgan

Registriert seit: 16. Okt 2003
Ort: Hannover
44 Beiträge
 
Delphi 7 Professional
 
#1

Mitbekommen wenn eine DosKonsole geschlossen wird.

  Alt 18. Nov 2004, 21:16
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
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#2

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.

  Alt 19. Nov 2004, 00:39
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
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
corgan

Registriert seit: 16. Okt 2003
Ort: Hannover
44 Beiträge
 
Delphi 7 Professional
 
#3

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.

  Alt 19. Nov 2004, 09:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#4

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.

  Alt 19. Nov 2004, 10:01
kannst du nich direkt die lame.dll aufrufen? dann sparst du dir den umweg über die DOS-Prompt...
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
corgan

Registriert seit: 16. Okt 2003
Ort: Hannover
44 Beiträge
 
Delphi 7 Professional
 
#5

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.

  Alt 19. Nov 2004, 10:15
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#6

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.

  Alt 19. Nov 2004, 15:49
ich hab noch nie was mit der lame.dll gemacht, ich weiss nur, dass es sie gibt
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#7

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.

  Alt 19. Nov 2004, 16:10
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;
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#8

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.

  Alt 20. Nov 2004, 10:44
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.
  Mit Zitat antworten Zitat
corgan

Registriert seit: 16. Okt 2003
Ort: Hannover
44 Beiträge
 
Delphi 7 Professional
 
#9

Re: Mitbekommen wenn eine DosKonsole geschlossen wird.

  Alt 20. Nov 2004, 10:59
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
  Mit Zitat antworten Zitat
Antwort Antwort


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:52 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