废话少说,上代码
cpp
/*
* brief: 根据进程相对路径获取进程ID,模糊比较
*/
int get_pid_by_path(const char *process_path)
{
pid_t pid = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(hSnapshot, &pe32))
{
do
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID);
if (hProcess)
{
TCHAR szPath[MAX_PATH] = { 0 };
if (GetProcessImageFileName(hProcess, szPath, MAX_PATH))
{
if (strstr(szPath, process_path) != NULL)
{
pid = pe32.th32ProcessID;
log_debug(__FILE__, __LINE__, "pid %d szpath:%s process_path:%s", pid, szPath, process_path);
CloseHandle(hProcess);
break;
}
}
else
log_debug(__FILE__, __LINE__, "GetProcessImageFileName szpath:%s process_path:%s error %d", pe32.szExeFile, process_path, GetLastError());
CloseHandle(hProcess);
}
else
log_debug(__FILE__, __LINE__, "OpenProcess failed szpath:%s process_path:%s error %d", pe32.szExeFile, process_path, GetLastError());
} while (Process32Next(hSnapshot, &pe32));
}
CloseHandle(hSnapshot);
}
return pid;
}
- 以上接口可以用作查找windows所有运行进程。
- 这其中的问题在GetProcessImageFileName的用法上,用该接口比较稳定。
- xp以前更老的版本则需要使用GetModuleFileNameEx。
- QueryFullProcessImageName 是vista新增的兼容性不好**。**
- GetProcessImageFileName是必须SYSTEM权限才稳定,至于怎么获取SYSTEM权限,则需要自己恶补一下windows知识了。