获取Delphi中CreateProcess创建的程序的PiD

时间:2014-04-10 15:40:17

标签: delphi ffmpeg

我使用delphi XE3我调用cmd并在一个线程中打开ffmpeg并将命令传递给它

我想同时运行5个或更多线程

procedure RunFF.Execute;
var

  SecAtrrs: TSecurityAttributes;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  pCommandLine: array[0..255] of AnsiChar;
  BytesRead: Cardinal;
  WorkDir,result: string;
  Handle: Boolean;
begin
  Result := '';
  workdir :='C:\Users\M\Desktop\ffmpeg\bin';
  with SecAtrrs do begin
    nLength := SizeOf(SecAtrrs);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SecAtrrs, 0);
  try
    with StartupInfo do
    begin
      FillChar(StartupInfo, SizeOf(StartupInfo), 0);
      cb := SizeOf(StartupInfo);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_HIDE;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;
 //   WorkDir := Work;
    Handle := CreateProcess(nil, PChar('cmd.exe /C ' + cmd2),
                            nil, nil, True, 0, nil,
                            PChar(WorkDir), StartupInfo, ProcessInfo);

    CloseHandle(StdOutPipeWrite);
    if Handle then
      try
        repeat
          WasOK := ReadFile(StdOutPipeRead, pCommandLine, 255, BytesRead, nil);
          if BytesRead > 0 then
          begin
            pCommandLine[BytesRead] := #0;
            Result := Result + pCommandLine;
            form3.Memo1.Text := result;
          end;
        until not WasOK or (BytesRead = 0);
        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
      finally
        CloseHandle(ProcessInfo.hThread);
        CloseHandle(ProcessInfo.hProcess);
      end;
  finally
    CloseHandle(StdOutPipeRead);
  end;


end;

我如何获得ffmpeg或cmd的PiD以便我可以杀死它!因为当我关闭我的应用程序cmd和ffmpeg继续运行..

1 个答案:

答案 0 :(得分:2)

CreateProcess填充的PROCESS_INFO结构包含新进程的PID。

请注意,这不是ffmpeg进程的PID。它将是cmd进程的PID。在这里使用cmd似乎没什么意义。你也可以直接打电话给ffmpeg。然后你已经拥有了所需的PID来杀死这个过程。

我不确定你是怎么想杀死这个过程的。如果要打电话给TerminateProcess,那么您需要一个处理句柄而不是PID。

请注意,CreateProcess会返回BOOL而不是句柄。我之前看到的这个变量命名错误,我希望某处有一些示例代码会导致错误,然后每个使用它的人都会重复它。叹息。