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?