看流星社区

 找回密码
 注册账号
查看: 2474|回复: 0

C++ 遍历指定进程的线程列表,在 VS2015 测试通过,已添加中文注释。

[复制链接]

该用户从未签到

发表于 2016-7-29 11:00:59 | 显示全部楼层 |阅读模式
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>

//  提前声明:
BOOL ListProcessThreads(DWORD dwOwnerPID);
void printError(TCHAR* msg);

int main(void) {
        ListProcessThreads(GetCurrentProcessId());  // 可使用任务管理器获取某进程的 PID,然后替换 GetCurrentProcessId()
        return 0;
}

BOOL ListProcessThreads(DWORD dwOwnerPID) {
        HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
        THREADENTRY32 te32;

        // 把所有进程拍一个快照
        hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
        if (hThreadSnap == INVALID_HANDLE_VALUE)
                return(FALSE);

        // 在使用 Thread32First 前初始化 THREADENTRY32 的结构大小.
        te32.dwSize = sizeof(THREADENTRY32);

        // 获取第一个线程信息, 如果失败则退出.
        if (!Thread32First(hThreadSnap, &te32)) {
                printError(TEXT("Thread32First"));  // 打印显示错误 [这里可用 GetLastError() 查看具体错误原因]
                CloseHandle(hThreadSnap);     // 必须在使用后清除快照对象!
                return(FALSE);
        }

        // 现在获取系统线程列表, 并显示与指定进程相关的每个线程的信息
        do {
                if (te32.th32OwnerProcessID == dwOwnerPID) {
                        _tprintf(TEXT("\n     THREAD ID      = 0x%08X"), te32.th32ThreadID);
                        _tprintf(TEXT("\n     base priority  = %d"), te32.tpBasePri);
                        _tprintf(TEXT("\n     delta priority = %d"), te32.tpDeltaPri);
                }
        } while (Thread32Next(hThreadSnap, &te32));

        _tprintf(TEXT("\n"));

        //  千万不要忘记清除快照对象!
        CloseHandle(hThreadSnap);
        return(TRUE);
}

void printError(TCHAR* msg) {
        DWORD eNum;
        TCHAR sysMsg[256];
        TCHAR* p;

        eNum = GetLastError();
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, eNum,
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 默认语言
                sysMsg, 256, NULL);  // 行末结尾使用 NULL .
        p = sysMsg;
        while ((*p > 31) || (*p == 9))
                ++p;
        do { *p-- = 0; } while ((p >= sysMsg) &&
                ((*p == '.') || (*p < 33)));

        // 打印消息
        _tprintf(TEXT("\n  WARNING: %s failed with error %d (%s)"), msg, eNum, sysMsg);
}
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 11:24

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表