说说无效的线程和进程ID

说说无效的线程和进程ID

作者:BlogUpdater |  时间:2020-12-18 |  浏览:1067 |  评论已关闭 条评论

有这么个点子
也许有一天你突发奇想:想要一个特殊的值来代表一个无效的线程或者进程ID。
那有哪些值可以用呢?

在Microsoft的技术文档中,还没有一篇专门的文章讲过这事儿。但是,你如此聪慧,想必也应该想到一些好点子?

如果你需要一个特殊值来表示无效的线程ID,你可以使用0。
你可能会问:为什么可以用0来表示一个无效的线程ID呢?

兄台好眼力
我们来看看这个API: SetWindowsHookEx。如果你仔细看看,就会发现:如果你传入一个0值作为参数,则钩子会被安装到当前桌面中的所有线程。这隐含了这样一层意思:即0本身不是一个有效的线程ID?为什么?因为如果它是一个有效线程,Microsoft为什么要对所有线程都安装钩子呢?

另外一个API是GetThreadID,如果此API调用失败,则会返回一个0作为它的错误返回值。

类似的,如果你需要一个无效的进程ID,你可以使用(DWORD)-1。
这个说法来自这个API: AllowSetForegroundWindow。宏定义ASFW_ANY(值为-1)有它特殊的意思:这个值表明该进程是一个无效进程。

另外,你也可以使用0作为一个无效进程的ID,因为它会作为API GetProcessId和GetProcessIdOfThread的错误返回值。

总结
记住一句话足矣:无效线程ID使用0表示,无效进程ID使用(DWORD)-1或者0表示。
注意这里的DWORD类型转换,可别又掉到signed和unsiged的坑里。(参考唐伯虎真迹:老虎惊讶图)

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Invalid thread and process IDs》

标签:

评论已关闭。