Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ShellExecuteExW: starten und beenden eines Prozesses (https://www.delphipraxis.net/139380-shellexecuteexw-starten-und-beenden-eines-prozesses.html)

schwa226 27. Aug 2009 18:45


ShellExecuteExW: starten und beenden eines Prozesses
 
Hi!

Ich benutze ShellExecuteExW um externe Programme zu starten:
http://www.delphipraxis.net/internal...hellexecuteexw
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!

Apollonius 27. Aug 2009 18:48

Re: ShellExecuteExW: starten und beenden eines Prozesses
 
Doch, TerminateProcess tut, was es soll - weshalb man es auch nicht benutzen sollte. Zeig mal deinen Code.

schwa226 27. Aug 2009 18:53

Re: ShellExecuteExW: starten und beenden eines Prozesses
 
Delphi-Quellcode:
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;
im Result steht somit der Wert von hProcess denn ich dann so beenden will:

Delphi-Quellcode:
TerminateProcess(ExternProgram.hProcess, 1);

Apollonius 27. Aug 2009 19:12

Re: ShellExecuteExW: starten und beenden eines Prozesses
 
Und jetzt denk mal scharf nach, was
Delphi-Quellcode:
CloseHandle(ShExecInfoW.hProcess);
tun könnte.

schwa226 27. Aug 2009 19:50

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)

Apollonius 27. Aug 2009 19:57

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.

schwa226 27. Aug 2009 20:04

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?

Apollonius 27. Aug 2009 20:06

Re: ShellExecuteExW: starten und beenden eines Prozesses
 
Was willst du eigentlich tun? Mit Findwindow wirst du auf anderssprachigen Systemen Probleme bekommen.

schwa226 27. Aug 2009 20:12

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.

Apollonius 27. Aug 2009 20:24

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 15:54 Uhr.
Seite 1 von 2  1 2      

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