- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
#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);
} |
|