说说无效的线程和进程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》
- 下一篇: 桌面窗口的特殊性
- 上一篇: 请特别注意COM组件的线程模型
相关推荐
- WinXP: 说道说道那些小小的覆盖图标
- Posted on 01月14日
- 错误信息:WordPress升级时提示另一更新正在进行
- Posted on 05月20日
- 说说有点意思的STRRET结构体
- Posted on 09月20日
- 为什么内存空间分配总是以64K为边界?
- Posted on 05月27日
评论已关闭。