AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) CreateProcess & TerminateProcess schlägt fehl
Thema durchsuchen
Ansicht
Themen-Optionen

CreateProcess & TerminateProcess schlägt fehl

Ein Thema von AScomp · begonnen am 17. Feb 2021 · letzter Beitrag vom 20. Feb 2021
 
AScomp

Registriert seit: 26. Okt 2002
Ort: Stuttgart
28 Beiträge
 
Delphi XE Professional
 
#1

CreateProcess & TerminateProcess schlägt fehl

  Alt 17. Feb 2021, 15:55
Hallo zusammen,

meine Problemstellung ist wie folgt:

Ich rufe den Windows Explorer (explorer.exe) auf und übergebe /root,X: als Parameter, um Netzlaufwerk X: aufzuwecken. Das funktioniert soweit auch, allerdings möchte ich die geöffnete Explorer-Instanz auch wieder sauber schließen.

Ganz egal, ob ich das mit ShellExecuteEx oder CreateProcess probiere, ich erhalte immer eine ProcessID, die nicht mit der im Taskmgr übereinstimmt. Entsprechend kriege ich den Prozess auch nicht wieder geschlossen.

Hier mal mein Beispielcode (habe versch. TerminateProcess-Varianten ausprobiert, auch vor und nach dem CloseHandle-Aufruf, alles erfolglos):

Delphi-Quellcode:
function ExecuteProcess(const FileName, Params: string; Folder: string; RunMinimized: boolean; iWaitMS: Integer): boolean;
var
  CmdLine: string;
  WorkingDirP: PChar;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
begin
  Result := true;
  CmdLine := '"' + FileName + '" ' + Params;
  if Folder = 'then Folder := ExcludeTrailingPathDelimiter(ExtractFilePath(FileName));
  ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
  StartupInfo.cb := SizeOf(StartupInfo);
  if RunMinimized then
    begin
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := SW_HIDE;
    end;
  if Folder <> 'then WorkingDirP := PChar(Folder)
  else WorkingDirP := nil;
  if not CreateProcess(nil, PChar(CmdLine), nil, nil, false, 0, nil, WorkingDirP, StartupInfo, ProcessInfo) then
    begin
      Result := false;
      exit;
    end;
  with ProcessInfo do
    begin
      CloseHandle(hThread);
      repeat
            Sleep(100);
            Application.ProcessMessages;
            iWaitMS := iWaitMS - 100;
      until iWaitMS <= 0;
      CloseHandle(hProcess);
      //TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, false, GetProcessID(ProcessInfo.hProcess)), 0);
      TerminateProcess(OpenProcess(PROCESS_TERMINATE, false, ProcessInfo.dwProcessId), 0);
      //TerminateProcess(ProcessInfo.hProcess, 0);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     ExecuteProcess('explorer.exe', '/root,' + ExtractFileDrive('C:\Temp\'), '', false, 3000);
end;
Hinweis: Im Beispiel teste ich mit C:, das macht allerdings von der Problematik her keinen Unterschied.

Sobald ich die im taskmgr angezeigte ProcessID an TerminateProcess übergebe, wird die Exporer-Instanz sauber geschlossen. Ich scheitere einzig daran, die korrekte ProcessID zu ermitteln.

Hat jemand eine Idee?
Viele Grüße,

Andy Ströbel
  Mit Zitat antworten Zitat
 


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 23:16 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