【问题标题】:start a process and obtain its pid启动一个进程并获取它的 pid
【发布时间】:2017-05-17 14:40:54
【问题描述】:

使用 delphi XE 我试图用不同的参数多次执行一个 exe 文件 但由于各种原因,我需要分别关闭/重新启动每一个。

所以我想如果我启动那个 example.exe 并获取它的 pid
稍后我将能够使用该唯一的 pid 值将其杀死。

看看我是否只是简单地执行了 example.exe 然后尝试使用进程名称或进程文件路径获取该进程的 PID 它最终会给我错误的结果,因为大约有 4 个具有该名称的进程。

有什么建议或想法吗? 我的问题可能与其他一些问题相似,但我需要返回 pid 值,所以请记住这一点

【问题讨论】:

  • 假设您使用 CreateProcess 启动 EXE,您可以简单地保留进程的句柄,这比寻找 PID 更可靠。

标签: delphi delphi-xe


【解决方案1】:

使用 Win32 API CreateProcess() 函数。它输出一个 PROCESS_INFORMATION 结构,其中包含已启动进程及其主线程的 ID 和句柄。可以使用进程句柄等待进程退出。

要终止进程,可以将进程句柄传递给TerminateProcess()

或者,你可以更加文明:

和/或:

  • 向主线程发布WM_QUIT 消息。

如果这不起作用,请使用TerminateProcess() 作为最后的手段。

【讨论】:

    【解决方案2】:

    研究使用 CreateProcess。 StackOverflow 上有多个示例,包括:Hide process window with 'CreateProcess'

    如果调用成功,您将在传递给 CreateProcess 的 TProcessInformation 参数中获得 Process 的句柄。

    【讨论】:

    • 如果您仍需要 PId,请在句柄上使用 GetProcessId。
    • GetProcessId 将被杀死。只需记住 PID 而不是句柄。 CreateProcess 产生。
    • @SertacAkyuz 这不是必须的,CreateProcess() 还返回启动进程的 PID(以及进程的主线程的 ID 和句柄)。请参阅PROCESS_INFORMATION 结构。
    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多