关于pre-vista系统的GetThreadId?

时间:2009-10-03 22:03:16

标签: winapi windows-vista multithreading portability

显然,GetThreadId是一个Vista API。如何在pre vista系统上获得线程的ID?

3 个答案:

答案 0 :(得分:6)

有几个选择:

答案 1 :(得分:3)

如果你能以某种方式使有问题的线程调用GetCurrentThreadId并将其存储在某个地方,你可以阅读结果。

答案 2 :(得分:3)

如果有问题的线程经常进入可警告的等待状态,您可以发送一个QueueUserAPC的APC;然后,APC处理程序可以调用GetCurrentThreadId并使用您喜欢的任何方法将结果传回给调用者。

您也可以使用未记录的NT函数执行此操作。在NtQueryInformationThread()类上使用ThreadBasicInformation将在returned structure中为您提供线程ID。可以在wine source中找到一个示例。但是,我不确定这个版本的Windows是什么版本 - 请记住,这些未记录的函数可以随时更改,因此最好在您感兴趣的旧版Windows上测试它们,并且只需使用GetThreadId ()可用的地方。

请注意,这些未记录的函数只能由NTDLL上的LoadLibrary()和GetProcAddress()访问;他们没有导入库。 According to MSDN,可以在Winternl.h中找到数据结构的声明,但如果没有,只需根据上面的ntinternals链接定义它们。