2013-01-05 124 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