2013-01-05 78 views
0

我需要找到一个进程的ID,我只有它的名字,我知道只有一个实例会一次运行,所以不会有多个问题进程与我正在寻找的同名进程。获取进程的ID从进程名称

如果有人能解释我如何才能从名字中获得进程的ID,那么我将不胜感激 - 代码示例将非常出色。

+1

哪个操作系统? Boost可能有它,我不知道。 – chris

回答

2

从你的其他问题来看(RegSetValueEx在标题中有点显而易见),我假设你在Windows上。对于纯粹的Windows API解决方案,您可以使用Toolhelp32 API浏览正在运行的进程的快照,并将其名称与您正在查找的名称进行比较。您对只有一个名字的纸条,但它可能在未来是有益的,或者给别人,拥有该名称的所有PID,所以我会做到这一点:

std::vector<DWORD> pids; 

HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //all processes 

PROCESSENTRY32W entry; //current process 
entry.dwSize = sizeof entry; 

if (!Process32FirstW(snap, &entry)) { //start with the first in snapshot 
    return 0; 
} 

do { 
    if (std::wstring(entry.szExeFile) == wantedProcessName) { 
     pids.emplace_back(entry.th32ProcessID); //name matches; add to list 
    } 
} while (Process32NextW(snap, &entry)); //keep going until end of snapshot 
+0

感谢Chris的回答,但是我在编译过程中遇到错误。 - 错误1 \t错误C2440:'':无法从'WCHAR [260]'转换为'std :: string'main.cpp 32 1 main'建议? – Ryan

+0

@ user1661022,如果你使用'TCHAR'和'TEXT'等等,我会建议像'lstrcmp'这样的代替。如果你只是使用宽字符串,使用'std :: wstring'。 – chris

+0

我试过这样做(我把它改成了'(wstring(entry.szExeFile)== L“test.exe”)'但是当我得到这部分代码时,我的应用程序只是关闭而没有错误消息 – Ryan

0

在* nix的环境,man 3 sysctl

+0

这不是很有用,你能不能加上样本代码和解释说明以便更清楚 – JOM

+0

YGWAGAM。例如,ttp://forums.devshed.com/c-programming-42/c-function-to-find-a-process-id-and-kill-it-65395.html。 – Colselaw