AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi ShellExecuteExW: starten und beenden eines Prozesses
Thema durchsuchen
Ansicht
Themen-Optionen

ShellExecuteExW: starten und beenden eines Prozesses

Ein Thema von schwa226 · begonnen am 27. Aug 2009 · letzter Beitrag vom 28. Aug 2009
Antwort Antwort
Seite 1 von 2  1 2      
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

ShellExecuteExW: starten und beenden eines Prozesses

  Alt 27. Aug 2009, 18:45
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!
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: ShellExecuteExW: starten und beenden eines Prozesses

  Alt 27. Aug 2009, 18:48
Doch, TerminateProcess tut, was es soll - weshalb man es auch nicht benutzen sollte. Zeig mal deinen Code.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#3

Re: ShellExecuteExW: starten und beenden eines Prozesses

  Alt 27. Aug 2009, 18:53
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:

TerminateProcess(ExternProgram.hProcess, 1);
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: ShellExecuteExW: starten und beenden eines Prozesses

  Alt 27. Aug 2009, 19:12
Und jetzt denk mal scharf nach, was
CloseHandle(ShExecInfoW.hProcess); tun könnte.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#5

Re: ShellExecuteExW: starten und beenden eines Prozesses

  Alt 27. Aug 2009, 19:50
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)
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: ShellExecuteExW: starten und beenden eines Prozesses

  Alt 27. Aug 2009, 19:57
Control.exe zeigt die Systemsteuerung nicht an, sondern weist nur die Shell an, das zu tun. Übrigens könntest du auch mal GetLastError fragen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#7

Re: ShellExecuteExW: starten und beenden eines Prozesses

  Alt 27. Aug 2009, 20:04
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?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: ShellExecuteExW: starten und beenden eines Prozesses

  Alt 27. Aug 2009, 20:06
Was willst du eigentlich tun? Mit Findwindow wirst du auf anderssprachigen Systemen Probleme bekommen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#9

Re: ShellExecuteExW: starten und beenden eines Prozesses

  Alt 27. Aug 2009, 20:12
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.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: ShellExecuteExW: starten und beenden eines Prozesses

  Alt 27. Aug 2009, 20:24
Wir hatten gerade festgestellt, dass Control.exe kein Fenster erzeugt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:22 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