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

标签 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 继续运行..

最佳答案

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

请注意,这不是 ffmpeg 进程的 PID。它将是 cmd 进程的 PID。使用 cmd 似乎没什么意义这里。你也可以直接调用ffmpeg。然后,您已经拥有了终止进程所需的 PID。

我不确定您要如何终止该进程。如果您要调用TerminateProcess ,那么你需要一个进程句柄而不是 PID。

请注意 CreateProcess返回 BOOL而不是 handle 。我以前见过这个变量命名错误,我希望在某个地方有一些示例代码犯了错误,然后使用它的每个人都会重复它。叹。

关于delphi - 获取 Delphi 中 CreateProcess 创建的程序的 PiD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22992658/

相关文章:

delphi - 为什么有时需要重新启动 Delphi 7 才能使调试器工作

Delphi IdFTP - 获取以指定 ANSI 代码页编码的文件列表

c++ - 在 C++ 程序中包含 ffmpeg 命令

windows - 合并\加入三个 FFMPEG 命令(Drawtext/-filter_complex overlay/anullsrc=channel_layout)

delphi - 如何释放通用 TList<T>?

mysql - Delphi 和 MySQL - 定期弹出数据库错误 - 如何修复它?

delphi - 如何在TDBCtrlGrid中设置PanelHeight?

ffmpeg - 将 Cut 与 Fast Seek -ss -to 和 HH :MM:SS:MS 一起使用

ffmpeg - 如何加入两个 ffmpeg 命令

ffmpeg - 使用 ffmpeg 录制 X 屏幕时获得一致的 60fps