指定一个目标进程,怎样得到目标进程内所有的线程信息啊?就是能够得到目标进程内所有线程的Id就好了,谢谢了

解决方案 »

  1.   

    BOOL ProcessInformation(DWORD dwProcessID)
    {
        HANDLE          hThreadSnap  = NULL;
        HANDLE          hThread      = NULL;
        THREADENTRY32   ThreadEntry32; 

    __try
    {
    hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); 
         if(hThreadSnap == INVALID_HANDLE_VALUE) 
         {
    printf("CreateToolhelp32Snapshot for thread Error: %d\n",GetLastError());
    bResult = FALSE;
    __leave;
    }// OpenThread = (HANDLE(__stdcall *)(DWORD,BOOL,DWORD))GetProcAddress(GetModuleHandle("kernel32"),"OpenThread");
    if(OpenThread == NULL)
    {
    printf("GetProcAddress for OpentThread Error: %d\n",GetLastError());
    bResult = FALSE;
    __leave;
    }

    ThreadEntry32.dwSize = sizeof(THREADENTRY32); 
        if(Thread32First(hThreadSnap, &ThreadEntry32)) 
    {
    printf("%-10s%-10s%-9s%15s\n\n","ThreadID","BasePrio","CreateTime","ProcessorTime");
                do 
    {
         if(ThreadEntry32.th32OwnerProcessID != dwProcessID)
    {
    continue;
    }
                printf("%-10d",ThreadEntry32.th32ThreadID); 
    printf("%8d",ThreadEntry32.tpBasePri);
      
    hThread = OpenThread(THREAD_ALL_ACCESS,FALSE,ThreadEntry32.th32ThreadID);
    if(hThread == NULL)
    {
    bResult = FALSE;
    continue; 
    } if(!GetThreadTimes(hThread,&CreateTime,&ExitTime,&KernelTime,&UserTime))
    {
        bResult = FALSE;
    }
        else
    {
        FileTimeToSystemTime(&CreateTime,&SystemTime);
        printf("    %.2d:%.2d:%.2d",(SystemTime.wHour+8)%24,SystemTime.wMinute,SystemTime.wSecond);
    ProcessTime.dwHighDateTime = KernelTime.dwHighDateTime + UserTime.dwHighDateTime;
    ProcessTime.dwLowDateTime  = KernelTime.dwLowDateTime  + UserTime.dwLowDateTime;
    FileTimeToSystemTime(&ProcessTime,&SystemTime);
    printf("  %.2d:%.2d:%.2d.%.4d  ",SystemTime.wHour,SystemTime.wMinute,SystemTime.wSecond,SystemTime.wMilliseconds);
    } printf("\n");
    }while (Thread32Next(hThreadSnap, &ThreadEntry32)); 

    printf("\nThread:\t %d\n",dwThread);

        else 
    {
    printf("Thread32First Error: %d\n",GetLastError());
    bResult = FALSE;
    __leave;
    }
    }
    __finally
    {
    if(hThreadSnap != NULL)
    {
    CloseHandle (hThreadSnap); 
    }
    }
    }
    能够获取线程ID,优先级,创建时间,进程时间4个属性。程序最好在VC7下面编译。
      

  2.   

    HMODULE hKernel = NULL;
    HANDLE hSnapshot = NULL;
    THREADENTRY32 te32 = {0};
    DWORD dwThrdCount = 0;hKernel = GetModuleHandle("KERNEL32.DLL");
    if(hKernel) {
        createtoolhelp32snapshot = (CREATESNAPSHOT)GetProcAddress(
      hKernel, "CreateToolhelp32Snapshot");    thread32first = (THREADWALK)GetProcAddress(hKernel, "Thread32First");    thread32next = (THREADWALK)GetProcAddress(hKernel, "Thread32Next");
    }if(!(thread32first && thread32next && createtoolhelp32snapshot))
    return;
    hSnapshot = createtoolhelp32snapshot(TH32CS_SNAPTHREAD, 0);
    if(hSnapshot == (HANDLE)-1) return;te32.dwSize = sizeof(THREADENTRY32);
    if(thread32first(hSnapshot, &te32)) {
       do {
          if(te32.th32OwnerProcessID==你想要枚舉線程的進程ID){
      te32.th32ThreadID //得到指定進程ID的線程ID值
       dwThrdCount++; //統計線程個數
           }    } while(thread32next(hSnapshot, &te32));
    } else {
    dwThrdCount = 0;
    }CloseHandle(hSnapshot);
      

  3.   

    CreateToolhelp32Snapshot(
      DWORD dwFlags,       
      DWORD th32ProcessID  //在这里代入id
    );
      

  4.   

    使用PSAPI可以得到线程的更多信息。
      

  5.   

    其实就是得到所有线程的句柄,然后看他的processid是不是你指出的进程,如果是就记录下来,然后就可以了