首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

说说无效的线程和进程ID

有这么个点子

也许有一天你突发奇想:想要一个特殊的值来代表一个无效的线程或者进程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》

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201218A0HBZP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券