![]() |
ShellExecuteExW: starten und beenden eines Prozesses
Hi!
Ich benutze ShellExecuteExW um externe Programme zu starten: ![]() Jedoch so abgändert, dass nicht gewartet wird bis es beendet wurde. Nach dem Starten ist in hProcess ja das Prozess-Handle des externen Programmes, oder? Wie beende ich das wieder? TerminateProcess macht auf jeden Fall nichts! |
Re: ShellExecuteExW: starten und beenden eines Prozesses
Doch, TerminateProcess tut, was es soll - weshalb man es auch nicht benutzen sollte. Zeig mal deinen Code.
|
Re: ShellExecuteExW: starten und beenden eines Prozesses
Delphi-Quellcode:
im Result steht somit der Wert von hProcess denn ich dann so beenden will:
function ExecAndWait(Filename, Params: String;
WindowState: Word = SW_SHOWNORMAL; Wait : Boolean = False): Cardinal; var {$IFDEF UNICODE} ShExecInfoW: SHELLEXECUTEINFOW; {$ENDIF} ShExecInfoA: SHELLEXECUTEINFOA; // MSDN: ShellExecuteEx, ShellExecuteInfo begin Result := 0; if (Filename = '') or not FileExists(FileName) then exit; {$IFDEF UNICODE} if Win32IsUnicode then begin ProgramStarting := True; ZeroMemory(@ShExecInfoW, SizeOf(ShExecInfoW)); ShExecInfoW.Wnd := GetForegroundWindow; ShExecInfoW.cbSize := SizeOf(SHELLEXECUTEINFOW); ShExecInfoW.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfoW.lpVerb := 'open'; ShExecInfoW.lpFile := PWideChar(WideString(Filename)); ShExecInfoW.lpParameters := PWideChar(WideString(Params)); ShExecInfoW.lpDirectory := PWideChar(WideString(ExtractFileDir(Filename))); ShExecInfoW.nShow := WindowState; try ShellAPI.ShellExecuteExW(@ShExecInfoW); Result := ShExecInfoW.hProcess; if Wait then WaitForSingleObject(ShExecInfoW.hProcess, INFINITE); finally CloseHandle(ShExecInfoW.hProcess); ProgramStarting := False; end; end else {$ENDIF} begin ZeroMemory(@ShExecInfoA, SizeOf(ShExecInfoA)); ShExecInfoA.Wnd := GetForegroundWindow; ShExecInfoA.cbSize := sizeof(SHELLEXECUTEINFOA); ShExecInfoA.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfoA.lpVerb := 'open'; ShExecInfoA.lpFile := PAnsiChar(AnsiString(Filename)); ShExecInfoA.lpParameters := PAnsiChar(AnsiString(Params)); ShExecInfoA.lpDirectory := PAnsiChar(AnsiString(ExtractFileDir(Filename))); ShExecInfoA.nShow := WindowState; try ShellExecuteExA(@ShExecInfoA); Result := ShExecInfoA.hProcess; if Wait then WaitForSingleObject(ShExecInfoA.hProcess, INFINITE); finally CloseHandle(ShExecInfoA.hProcess); end; end; end;
Delphi-Quellcode:
TerminateProcess(ExternProgram.hProcess, 1);
|
Re: ShellExecuteExW: starten und beenden eines Prozesses
Und jetzt denk mal scharf nach, was
Delphi-Quellcode:
tun könnte.
CloseHandle(ShExecInfoW.hProcess);
|
Re: ShellExecuteExW: starten und beenden eines Prozesses
Ok,
du meinst wahrscheinlich das ich die Zeile CloseHandle(ShExecInfoW.hProcess); rausnehmen soll, oder? Habe sie einmal auskommentiert, aber TerminateProcess beendet es noch immer nicht! Zur Info: ich starte die "control.exe" (Systemsteuerung) |
Re: ShellExecuteExW: starten und beenden eines Prozesses
Control.exe zeigt die Systemsteuerung nicht an, sondern weist nur die Shell an, das zu tun. Übrigens könntest du auch mal GetLastError fragen.
|
Re: ShellExecuteExW: starten und beenden eines Prozesses
Ok,
das habe ich nicht gewusst! Habe nun im Taskmanager gesehen, dass die control.exe doch durch TerminateProcess beendet wird! Das Systemsteuerungs Fenster bleibt aber offen. Kann ich das nur durch FindWindow zumachen? |
Re: ShellExecuteExW: starten und beenden eines Prozesses
Was willst du eigentlich tun? Mit Findwindow wirst du auf anderssprachigen Systemen Probleme bekommen.
|
Re: ShellExecuteExW: starten und beenden eines Prozesses
Das habe ich mir auch gedacht!
Ich will ein externes Programm öffnen und per Hotkey z.B. ESC es wieder beenden. Kann ich aus der hProcess irgendiwe das Window Handle rausfinden? Dann kann ich ja durch das Handle das Fenster beenden. |
Re: ShellExecuteExW: starten und beenden eines Prozesses
Wir hatten gerade festgestellt, dass Control.exe kein Fenster erzeugt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:27 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