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

来源:互联网 发布:和前任做朋友 知乎 编辑:程序博客网 时间:2024/06/06 03:38

原文地址:https://msdn.microsoft.com/zh-cn/library/ms686852(v=vs.85).aspx


#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);}






0 0
原创粉丝点击