Einzelnen Beitrag anzeigen

AScomp

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

CreateProcess & TerminateProcess schlägt fehl

  Alt 17. Feb 2021, 16: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