2010-05-31 59 views
0

我很困惑用OpenThread Function打開不同的線程,並用NtQueryInformationThread原生函數檢查它們。 我沒有問題NtQueryInformationThread &我可以仔細檢查它們。 問題是我不知道如何通過使用OpenThread (使用SetDebugPrivilege考慮)來循環使用不同數量的線程。 假設我們有不同的線程從5100到5200 &我們想要依次檢查它們:例如5100,5101,5102,5103,5104,5105,5200 ...。 我不知道如何在delphi中以正確的方式使用OpenThread函數...。 我使用這個語法&我發現錯了:OpenThread()通過不同的線程號碼?

OpenThread(THREAD_ALL_ACCESS,false,(DWORD)5100) 

。 如果任何人都可以指導我如何使用OpenThread,但通過不同數量的線程,它將會很棒。

非常感謝。

回答

3

我不確定你是怎麼得到嚴格順序ID的線程,導致Windows不(必須)以任何模式分配線程ID。
如果你想通過一組線程的循環,你將不得不使用的工具幫助API:

  1. 呼叫CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0)獲取系統狀態快照通過螺紋
  2. 環路與Thread32FirstThread32Next和選擇你要使用的線程(例如通過其進程的ID)
  3. 使用OpenThread帶有適當的訪問掩碼,例如, THREAD_QUERY_INFORMATION
    不要使用THREAD_ALL_ACCESS,除非你創建在當前進程的線程,你知道你在做什麼
    (剋制自己只讀訪問,如果觸摸另一個進程的線程)
  4. 做什麼你想要,例如。調用NtQueryInformationThread
  5. 不要忘記CloseHandle

你,只要你不抱在處理任何線程終止(與具有相同ID一個新的線程被替換的可能性)線程處理。

編輯(進一步的澄清要求)
CreateToolhelp32SnapshotdwFlags == TH32CS_SNAPTHREAD爲您提供了一個全系統的快照所有線程在當下現有的(在th32ProcessID參數在這種情況下忽略),不管其狀態,並且隨後返回的THREADENTRY32結構包含th32ThreadIDth32OwnerProcessID字段,您可以使用它們來標識該線程。