windows下获取所有可执行文件的进程句柄
时间: 2023-08-12 16:14:35 浏览: 208
在Windows下,获取所有可执行文件的进程句柄可以通过以下步骤实现:
1. 枚举所有进程ID,可以使用Win32 API函数EnumProcesses。
2. 对于每个进程ID,调用OpenProcess函数打开进程句柄。
3. 使用GetModuleFileNameEx函数获取进程中所有可执行模块的文件名,如果返回值为0,则表示获取失败,可以使用GetLastError函数获取错误码。
4. 如果文件名以“.exe”结尾,则表示该模块是一个可执行文件,将该进程句柄保存到一个列表中。
下面是一个示例代码:
```c++
#include <windows.h>
#include <psapi.h>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main()
{
vector<HANDLE> processHandles;
DWORD processes[1024], cbNeeded, cProcesses;
if (!EnumProcesses(processes, sizeof(processes), &cbNeeded))
{
cout << "EnumProcesses failed." << endl;
return 1;
}
cProcesses = cbNeeded / sizeof(DWORD);
for (unsigned int i = 0; i < cProcesses; i++)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processes[i]);
if (hProcess != NULL)
{
HMODULE hMod;
DWORD cbNeeded;
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
{
TCHAR szModName[MAX_PATH];
if (GetModuleFileNameEx(hProcess, hMod, szModName, sizeof(szModName) / sizeof(TCHAR)))
{
string moduleName = szModName;
if (moduleName.substr(moduleName.length() - 4) == ".exe")
{
processHandles.push_back(hProcess);
}
}
}
CloseHandle(hProcess);
}
}
cout << "Found " << processHandles.size() << " processes." << endl;
return 0;
}
```
注意,使用GetModuleFileNameEx函数需要包含psapi.h头文件,并且链接psapi库。
阅读全文