Click here to Skip to main content
15,921,622 members
Articles / Programming Languages / C++
Article

How to get handle to any running process by its name

Rate me:
Please Sign up or sign in to vote.
3.57/5 (30 votes)
24 Aug 20041 min read 433.7K   8.6K   65   42
Get handle to any running process (by its name) by using performance data

Introduction

There are several ways to get the process id (and its handle afterwards) for any running process. One of them is by using functions that are available in PSAPI.DLL, which is distributed in the Microsoft® Platform Software Development Kit (SDK).The same information is generally available through the performance data.

One of the performance objects is 'Process' whose index is 230. The 'Process' object has several counters, one of them is 'ID Process' whose index is 784. A function called GetProcessID runs through the performance objects and counters and retrieves the process id for the required process name.

The following sample shows you how to retrieve the process handle by performance data.

The Sample

C++
std::vector<DWORD> SetOfPID;
GetProcessID("Rundll32",SetOfPID); 
     // get all process id's of Rundll32

if (SetOfPID.empty())   // Process is not running
{
    printf("Process is not running\n");
}
else    // Process is running
{
    for (int i=0;i < SetOfPID.size(); i++)
    {
        printf("Process ID is %d\n", SetOfPID[i]);
        HANDLE hProcess = OpenProcess(
             PROCESS_ALL_ACCESS,FALSE,SetOfPID[i]);
        // some code...
        CloseHandle(hProcess);
    }
}

More of my articles using performance counters

Updates

My first version returned only the first running instance. Since the process name is not unique I changed my code so it returns set of process id's.

  • 13.1.03 - I release the allocation of PERF_DATA_BLOCK at the end of the function
  • 19.3.03 - I add call to RegCloseKey(HKEY_PERFORMANCE_DATA) at the end of the function
  • 15.6.03 - Using none case-sensitive comparison for checking process existance.
  • 24.5.04 - Changed the first argument to RegQueryValueEx from "Global" (which retrieves the whole counters) to a string that specifies the specific process object and process-id counter. This change enables fast query.
  • 25.8.04 - Source and demo updated

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
Israel Israel
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralRe: Get Process Id from handle Pin
ravi_shingote31-Mar-03 3:32
ravi_shingote31-Mar-03 3:32 
GeneralRe: Get Process Id from handle Pin
Dudi Avramov1-Apr-03 20:26
Dudi Avramov1-Apr-03 20:26 
GeneralQuick fix Pin
Peter Donahue17-Mar-03 10:51
Peter Donahue17-Mar-03 10:51 
GeneralRe: Quick fix Pin
Dudi Avramov19-Mar-03 4:31
Dudi Avramov19-Mar-03 4:31 
Generali want same sort in vb Pin
pawankumar6-Feb-03 0:11
pawankumar6-Feb-03 0:11 
GeneralRe: i want same sort in vb Pin
Dudi Avramov6-Feb-03 3:54
Dudi Avramov6-Feb-03 3:54 
GeneralRe: i want same sort in vb Pin
Anonymous6-Feb-03 4:46
Anonymous6-Feb-03 4:46 
GeneralRe: i want same sort in vb Pin
Vladimir Afanasyev20-Jun-03 0:10
Vladimir Afanasyev20-Jun-03 0:10 
Next code will work for Win 2000/XP. WMI is native
for this systems. For another systems you need
install WMICore from Microsoft site.
No need additional code - only WMI.

Excel VB:

Private Sub CommandButton1_Click()

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name='msaccess.exe'")
For Each objProcess In colProcessList
ListBox1.AddItem (objProcess.Handle)
Next

End Sub

By the way, this code must also work for
solving the same task on remote PC.
You need set correct name for strComputer and get enough
privilegies for access to remote PC.

Similar code (see above) can be easy rewritten on C++
using IMoniker COM Interface. And it is even more easy
for C++ Builder than Visual because C++ Builder
has own Variant class that is good wrapper for
IDispatch interface.
GeneralDuh Pin
Andreas Saurwein13-Jan-03 0:03
Andreas Saurwein13-Jan-03 0:03 
GeneralRe: Duh Pin
John M. Drescher13-Jan-03 3:53
John M. Drescher13-Jan-03 3:53 
GeneralRe: Duh Pin
Dudi Avramov13-Jan-03 5:27
Dudi Avramov13-Jan-03 5:27 
GeneralRe: Duh Pin
????19-Mar-03 11:29
????19-Mar-03 11:29 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.