CreateProcess returns 句柄不同于启动 Chrome.exe

CreateProcess returns handle different than launched Chrome.exe

我正在使用 CreateProcess 并将 Chrome.exe 作为参数。

我正在获取我使用 PROCESS_INFORMATION 创建的进程的句柄,它内部有 hProcess

当我使用 GetProcessId(handle) 打印 PID 时,我得到的 PID 与任务管理器中显示的不同。

我试过设置回调函数在 Chrome.exe 存在后触发,但它还是触发了。这是预期的(不需要),因为 Chrome.exe PID 不同。

似乎当我在 Chrome.exe 上使用 CreateProcess 时,chrome 会随意启动它自己的新进程并使我的所有控件变得无用。

我已经尝试将它与 FireFox.exe 一起使用并且效果很好,我得到了指向正确进程的句柄。

是否无法获取我生成的 Chrome 进程的句柄?

您使用 CreateProcess() 生成的 Chrome 进程依次生成自己的子进程,然后自行终止。您的 Firefox 不会这样做,至少最初不会(Firefox 确实为浏览器选项卡使用子进程 - 大多数现代浏览器都这样做,以确保安全性和稳定性)。

因此,您从 CreateProcess() 获得的 Chrome PID/handle 尽管有效,但对您的需求而言显然无用。

但是,一切并没有丢失。您可以获得有关 Chrome 本身生成的子 PID 的通知。将生成的 Chrome 进程添加到 job object, then use SetInformationJobObject() to assign that job to an I/O completion port, then use GetQueuedCompletionStatus() to receive events from the job, in particular JOB_OBJECT_MSG_NEW_PROCESS whenever a new process is created in the job, and JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO when all processes in the job have ended. See How do I wait until all processes in a job have exited? 以获得更多详细信息。