如何可靠地检查一个Windows进程是否是C ++中的另一个父进程?

我正在为一个给定的PID获取父进程的PID的函数。 function的原型是

DWORD getParentPid( DWORD pid ); 

为此,我使用CreateToolhelp32Snapshot函数(和相关函数)来获取给定PID PID的PROCESSENTRY32结构。 然后,我可以使用该结构的th32ParentProcessId字段来获取创build我的给定进程的进程的PID。

但是,由于父进程可能已经被销毁(并且它的PID可能已被Windows重用),所以我使用GetProcessTimes函数来获取所谓父进程和subprocess的创build时间,然后使用CompareFileTime进行比较。

如果CompareFileTime返回-1 ,我知道具有父ID的进程是在我的subprocess之前创build的,所以它确实是父进程。 否则,这显然是一个重用的ID – 而且父PID是无效的(它不再引用原来的父母)。

问题在于它非常依赖严格单调的系统时钟和GetProcessTimes的粒度。 我确实经历了CompareFileTime返回0 (意思是“平等的时间”),即使被考虑的过程确实是父子关系。 我可以改变我的检查,以便一个CompareFileTime结果值<= 0将被视为指示一个父,但是,然后我会打破(理论)的情况下,父母创build一个subprocess,然后父母被销毁,然后Windows重新- 使用PID – 全部在100ns内(这是GetProcessTimes的分辨率)。

我想知道是否有一种不同的,更可靠的机制来validation某个进程确实是C ++中另一个进程的父进程?

编辑:我需要这个function,以确定所有的subprocess(这意味着包括孙subprocess)。 CreateToolhelp32Snapshot允许我遍历所有进程,但是我需要查看每个进程的父PID,以确定它是否是我的进程的subprocess。

这里的示例:

http://msdn.microsoft.com/en-us/library/ms686701(v=vs.85).aspx

显示为processId调用CreateToolhelp32Snapshot参数为0,它使用选项TH32CS_SNAPPROCESS它说它捕获所有进程。 然后,一旦获得了快照,就像在示例中一样,您可以像快照中存在的那样走过程。 父代码在快照中应该是有效的,因为您正在查看所有进程的状态,因为它们是在创建快照时的单一时刻存在的。 你不必为你的流程开始时间比较而烦恼。

如果在您的应用程序运行时创建了这个进程,那么您可以重复遍历它,并重复使用PID。