![]() |
CMD / Prozess prüfen
Moin zusammen,
auch wenn es irgendwie ein blödes Problem ist, brauche ich eure unterstützung. Ich habe folgende Konsolenanwendung in Lazarus:
Delphi-Quellcode:
Mein Problem:
program Backup;
{$mode Delphi}{$H+} uses ShellAPI; {$R *.res} begin ShellExecute(0, nil, PChar('cmd'), PChar('/c wbadmin.exe start backup -quiet -vssCopy -backupTarget:D: -include:C:'), nil, 1); end. Ich muss wissen wann die cmd geschlossen wird um erst dann dieses Programm auch erst zu beenden. Hab schon viel gesucht, die Lösung scheint ja CreateProcess zu sein, jedoch bin ich scheinbar zu blöd diesen wirklich zu verstehen und somit anzuwenden/adaptieren. |
AW: CMD / Prozess prüfen
Keine Ahnung, wo ich das seinerzeit gefunden habe, vllt. hier in der DP?
Delphi-Quellcode:
function TMain.ShellExecute_AndWait(FileName: string; Params: string): bool;
var exInfo: TShellExecuteInfo; Ph: DWORD; begin FillChar(exInfo, SizeOf(exInfo), 0); with exInfo do begin cbSize := SizeOf(exInfo); fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT; Wnd := GetActiveWindow(); exInfo.lpVerb := 'open'; exInfo.lpParameters := PChar(Params); lpFile := PChar(FileName); nShow := SW_SHOWNORMAL; end; if ShellExecuteEx(@exInfo) then Ph := exInfo.hProcess else begin ShowMessage(SysErrorMessage(GetLastError)); Result := true; exit; end; while WaitForSingleObject(exInfo.hProcess, 50) <> WAIT_OBJECT_0 do Application.ProcessMessages; CloseHandle(Ph); Result := true; end; |
AW: CMD / Prozess prüfen
Habe in meinem "Gewusel" dashier gefunden:
Delphi-Quellcode:
function RunCmdLine(const CmdLine: string): Boolean;
var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin Result := False; FillChar(StartupInfo, SizeOf(StartupInfo), 0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := SW_SHOW; if CreateProcess(nil, PChar(CmdLine), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then begin repeat until WaitForSingleObject(ProcessInfo.hProcess, 1) = WAIT_OBJECT_0; CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); Result := True; end else MessageDLG('Cannot run command line: ' + CmdLine,mtError,[mbOk],0); end; |
AW: CMD / Prozess prüfen
@exInfo und Application.ProcessMessages meckert er an @Jumpy, braucht das ein uses?
|
AW: CMD / Prozess prüfen
Bei mir klappt das als Konsolenanwendung, wenn ich statt des MessageDLG halt
Delphi-Quellcode:
schreibe.
WriteLn('Cannot run command line: ' + CmdLine);
|
AW: CMD / Prozess prüfen
Funktioniert leider nicht.
Delphi-Quellcode:
Bringt kein Ergebnis/wird nicht gestartet bzw. endet beim "Connot run command line".
program Backup;
{$mode Delphi}{$H+} uses ShellAPI, Windows; {$R *.res} var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; CmdLine: string; begin //ShellExecute(0, nil, PChar('cmd'), PChar('/c wbadmin.exe start backup -quiet -vssCopy -backupTarget:D: -include:C:'), nil, 1); CmdLine := 'cmd /c wbadmin start backup -quiet -vssCopy -backupTarget:D: -include:C:'; FillChar(StartupInfo, SizeOf(StartupInfo), 0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := SW_SHOW; if CreateProcess(nil, PChar(CmdLine), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then begin repeat until WaitForSingleObject(ProcessInfo.hProcess, 1) = WAIT_OBJECT_0; CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); end else WriteLn('Cannot run command line: ' + CmdLine); sleep(5000); end. |
AW: CMD / Prozess prüfen
Fehlermeldung?
Bekommst Du die Ausgabe von WriteLn oder einfach nur nix? Und bei CmdLine wäre es durchaus hilfreich den vollständigen Namen und Pfad des aufzurufenden Programmes anzugeben. cmd /w hält die Kommandozeile offen, nachdem das per Parameter übergebene Programm beendet wurde. Damit wartet Dein Programm "ewig", bis zum nächsten Stromausfall oder sonst einer "externen Beendigung" der Kommandozeile. Sprich: Kann so nicht funktionieren. Frage: Muss denn CMD überhaupt aufgerufen werden?
Delphi-Quellcode:
CmdLine := 'PfadZumProgramm\wbadmin.endung start backup -quiet -vssCopy -backupTarget:D: -include:C:';
Beim Programmaufruf über Shellexeute, CreateProcess ... sollte man sich nicht dadrauf verlassen, das Windows das gewünschte schon irgendwie finden wird (das Gewünschte also (mehr oder weniger) zufällig im Pfad ist). Präzise Angaben helfen deutlich bei der Fehlersuche / Fehlervermeidung. |
AW: CMD / Prozess prüfen
wbadmin ist eine Windowsanwendung und liegt in System32, kann aber immer per wbadmin aufgerufen werden ohne Pfadangabe.
Der Befehl muss in der Eingabeaufforderung ausgeführt werden. Ich bekomme die Ausgabe von writeln. Zitat:
Ändert aber an der Ausführung nix, die CMD würde nur offen bleiben anstatt geschlossen zu werden. Edit: Hier trifft meine erste Aussage wohl nicht zu: Mit
Delphi-Quellcode:
funktioniert es.
CmdLine := 'C:/Windows/System32/wbadmin.exe start backup -quiet -vssCopy -backupTarget:D: -include:C:';
|
AW: CMD / Prozess prüfen
Ein möglicher Aufruf auf der Kommandozeile ohne Pfadangabe impliziert nicht, dass dies auch aus einem eigenen Programm heraus so sein muss.
Der Aufruf von wbadmin auf der Kommandozeile ohne Pfadangabe heißt nur, dass das Programm in der Umgebung der Kommandozeile im Suchpfad enthalten ist. Diese Umgebung muss nicht mit der Umgebung Deines Programmes übereinstimmen und schon garnicht mit der Umgebung, die CreateProcess bekommt. Das WriteLn bedeutet übrigens hier, dass schon CMD nicht gefunden wurde. Auch hier gilt: Vollständiger Pfad- und Dateiname. |
AW: CMD / Prozess prüfen
Zitat:
Du kannst das ja mal mit einem einachen Befehl testen Notepad.exe oder so. Wenn das geht, klappt ja zumindest der Aufruf mit WaitForSingleObject. Danach muss du halt schauen, wie das mit den Parameter-Liste ist. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:55 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