windows下遍历进程有多种方式:
进程快照:CreateToolhelp32Snapshot;
进程状态API:PSAPI;
在psapi中主要使用到的方法有:
EnumProcesses——枚举进程;
EnumProcessModules——枚举进程内模块;
GetModuleFileNameEx——获取模块名;
通过这3个方法就可以遍历进程以及进程内各个模块;
其中基本数据结构QString、QList是基于Qt的,如果用的不是Qt库,换成C++对应STL标准库List、String的即可;
//Win32Api:
void AdjustPrivilege()
{
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid))
{
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
}
CloseHandle(hToken);
}
}
//根据进程所在的路径查询进程,并返回进程的ID列表
QList<DWORD> CheckProcess(const QString &processPath)
{
AdjustPrivilege();
QList<DWORD> pIDList;
DWORD dwProcessId[1024];
DWORD bytesRet;
if (EnumProcesses(dwProcessId, sizeof(dwProcessId), &bytesRet))
{
HANDLE hProcess = NULL;
HMODULE hModus[1024];
DWORD bytesModuRet;
TCHAR szModuleName[MAX_PATH];
QStringList tempPathList = processPath.toLower()
.split(QRegExp("[/\\\\]"), QString::SkipEmptyParts);
QString processPathWinStd;//转成windows标准的路径
int listLength = tempPathList.length();
for (int idx = 0; idx < listLength; ++idx)
{
if (idx != 0)
processPathWinStd.push_back("\\");
processPathWinStd.push_back(tempPathList[idx]);
}
int ProcessNum = (bytesRet/sizeof(DWORD));
for (int i = 0, j = 0; i < ProcessNum; ++i)
{
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId[i]);
if (hProcess)
{