İsa*_*gül 2 windows winapi process
我正在用 C++ 开发 Windows 控制台应用程序。我需要我的程序对另一个我无法控制的进程执行一些操作。
但是,我对目标进程可能因某种原因(通过任务管理器等)终止的情况有一些疑问。使用已经终止的进程的句柄是否安全?
注意:如果其中一项功能失败,我会停止操作。
HANDLE hProcess = OpenProcess(pid);
if( hProcess != NULL )
{
// Lets suppose process is terminated here
/* Some operations on process using returned handle*/
}
Run Code Online (Sandbox Code Playgroud)
Windows 中的内核对象是引用计数的,引用表示为对象的句柄。客户端代码可以创建内核对象并接收初始引用(例如CreateProcess
),增加现有对象的引用计数(例如OpenProcess
, 或DuplicateHandle
),并减少引用计数(CloseHandle
)。只要您保留 a HANDLE
,该对象引用的对象HANDLE
就会保持活动状态。
对于流程对象,该对象至少只要您持有HANDLE
对它的引用 ( ) 就有效。进程已终止的事实是可以观察到的,但如果存在任何未完成的引用,则不会以其他方式使进程对象无效或销毁。
具体来说,这意味着您可以执行对“实时”进程(操作系统仍在调度线程执行的进程)执行的任何操作,例如WaitForSingleObject
. 此外,您可以拨打电话GetExitCodeProcess
,但该电话不会返回STILL_ACTIVE
。
除非调用CloseHandle
,您现在是对流程对象的消亡拥有发言权的利益相关者。除非您签字,否则它不会消失。由此推论,您现在还可以控制 PID 的有效性。它与进程的生命周期相关,只要您通过 a 持有对它的引用HANDLE
,该 PID 就不会被另一个进程重用。
总而言之,只要你坚持一个(过程),HANDLE
你就可以做任何事。
归档时间: |
|
查看次数: |
108 次 |
最近记录: |