GetThreadId в предыдущих версиях? - PullRequest
7 голосов
/ 04 октября 2009

Кстати, GetThreadId - это API-интерфейс Vista. Как я могу получить идентификатор потока в системах pre vista?

Ответы [ 3 ]

6 голосов
/ 04 октября 2009

Есть несколько вариантов:

  • Когда вы звоните CreateThread , вы получаете ручку обратно.
  • Вы можете вызвать GetCurrentThreadId , чтобы получить идентификатор текущего потока.
  • Вы можете использовать Thread32First / Thread32Next для перечисления потоков.
3 голосов
/ 04 октября 2009

Если рассматриваемый поток часто входит в состояние ожидания с оповещением, вы можете отправить ему APC с QueueUserAPC ; обработчик APC может затем вызвать GetCurrentThreadId и передать результат обратно вызывающей стороне, используя любой метод, который вам нравится.

Вы также можете сделать это с недокументированными функциями NT. Использование NtQueryInformationThread () в классе ThreadBasicInformation даст вам идентификатор потока в возвращаемой структуре . Пример можно найти в винном источнике . Однако я не уверен, в каких версиях окон это доступно - имейте в виду, что эти недокументированные функции могут измениться в любое время, поэтому лучше всего протестировать их на более старых версиях интересующих вас окон и просто использовать GetThreadId () где это доступно.

Обратите внимание, что эти недокументированные функции доступны только для LoadLibrary () и GetProcAddress () в NTDLL; у них нет библиотеки импорта. Согласно MSDN , декларации для структур данных можно найти в Winternl.h, но если нет, просто определите их сами, основываясь на ссылках ntinternals выше.

3 голосов
/ 04 октября 2009

Если вы можете каким-либо образом заставить рассматриваемый поток вызвать GetCurrentThreadId и сохранить его где-нибудь, вы можете прочитать результат.

...