views:

302

answers:

4

I am currently writing a very lightweight program so I have to use C++ since it is not bound to .NET framework which drastically increases size of the program.

I need to be able to terminate process and to do that I need to get a process handle. Unfortuanately I haven't figured how to do that yet.

P.S. I know that to kill a process you have to use TerminateProcess.

+1  A: 

CreateProcess and OpenProcess return process handles.

Here's some sample code to find a process by asking the system to list all processes and then searching the list for the process you want.

Jason Orendorff
So using OpenProcess with a process ID will give me access to the process?
Nick Brooks
+3  A: 

To get a handle to pass to TerminateProcess, use OpenProcess in combination with some other function like EnumProcesses.

Jon Benedicto
GetWindowThreadProcessId could perhaps be used: http://msdn.microsoft.com/en-us/library/ms633522%28VS.85%29.aspx
dalle
A: 
HANDLE explorer;
explorer = OpenProcess(PROCESS_ALL_ACCESS,false,2120);
TerminateProcess(explorer,1);

That worked

Nick Brooks
+2  A: 

The PID you need for OpenProcess() is not normally easy to get a hold of. If all you got is a process name then you need to iterate the running processes on the machine. Do so with CreateToolhelp32Snapshot, followed by Process32First and loop with Process32Next. The PROCESSENTRY32.szExeFile gives you the process name (not path!), th32ProcessID gives you the PID.

The next consideration is that the process may appear more than once. And there's a chance that the same process name is used for very different programs. Like "Setup". If you don't just want to kill them all, you'll need to try to obtain some runtime info from them. Window caption bar text, perhaps. GetProcessImageFileName() can give you the path to the .exe. It uses the native kernel format, you'd need QueryDosDevice to map a disk drive device name to a drive letter.

The next consideration is the rights you ask for in OpenProcess(). You are unlikely to get PROCESS_ALL_ACCESS, all you need is PROCESS_TERMINATE. Although that's privileged as well. Ensure the account you use to run your program can obtain that right.

Hans Passant