If you have the name of the process, and that process is not you, you must either search for a window you know that process created, and get the process ID from that, or, if you only have the name of the process, you need to use the PSAPI/ToolHelper API to enumerate all running processes, look at each one's name, check if it matched, and if so, grab it's process ID.
See here
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/base/about_psapi.asp
Bare in mind PSAPI only works with NT/2k/XP so if you want a cross platform soulition, use ToolTip - see the file Tlhelp32.h in the platform SDK for a statring point- but you want something like this which terminates a process given a name
<br />
BOOL CTestEnvKillerApp::InitInstance()<br />
{<br />
<br />
OSVERSIONINFO osvi;<br />
memset(&osvi, NULL, sizeof(OSVERSIONINFO));<br />
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);<br />
GetVersionEx(&osvi);<br />
<br />
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{<br />
HMODULE hLib = LoadLibrary( _T("psapi.dll") );<br />
if (NULL == hLib)<br />
{<br />
AfxMessageBox(_T("Could not load PSAPI.DLL.\nPlease check it's in your path"), MB_OK | MB_ICONEXCLAMATION);<br />
return FALSE;<br />
}<br />
lpfnEnumProcesses pFnEnumProc = (lpfnEnumProcesses)GetProcAddress( hLib, "EnumProcesses" );<br />
lpfnGetModuleBaseName pFnGetModBaseName = (lpfnGetModuleBaseName)GetProcAddress( hLib, "GetModuleBaseNameA" );<br />
lpfnEnumProcessModules pFnEnumProcMod = (lpfnEnumProcessModules)GetProcAddress( hLib, "EnumProcessModules" );<br />
<br />
if ( (NULL == pFnEnumProc) || (NULL == pFnGetModBaseName) || (NULL == pFnEnumProcMod) )<br />
{<br />
AfxMessageBox(_T("Could not find procedure in PSAPI.DLL"), MB_OK | MB_ICONEXCLAMATION);<br />
FreeLibrary(hLib);<br />
return FALSE;<br />
}<br />
<br />
DWORD dwNeeded = 0;<br />
DWORD dwProcessIDs[1024];<br />
memset(dwProcessIDs, NULL, sizeof(DWORD)*1024);<br />
<br />
if ( pFnEnumProc(dwProcessIDs, 1024, &dwNeeded) )<br />
{<br />
char szProcessName[MAX_PATH];<br />
<br />
short sNumProcs = (short)( dwNeeded/sizeof(DWORD) );<br />
for (short s = 0; s < sNumProcs; s++)<br />
{<br />
memset(szProcessName, NULL, sizeof(char)*MAX_PATH);<br />
<br />
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE,<br />
FALSE, dwProcessIDs[s] );<br />
if (hProcess) <br />
{ <br />
HMODULE hMod = NULL;<br />
dwNeeded = 0;<br />
<br />
if ( pFnEnumProcMod( hProcess, &hMod, sizeof(hMod), &dwNeeded) ) <br />
{<br />
if (!pFnGetModBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ) )<br />
{<br />
CloseHandle(hProcess);<br />
continue;<br />
}<br />
<br />
if ( ItsOurProcess() )<br />
{<br />
TerminateProcess(hProcess, 0);<br />
}<br />
}<br />
<br />
CloseHandle(hProcess);<br />
}<br />
}<br />
}<br />
<br />
FreeLibrary(hLib);<br />
}<br />
else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{<br />
HMODULE hLib = LoadLibrary( _T("kernel32.dll") );<br />
if (NULL == hLib)<br />
{<br />
AfxMessageBox(_T("Could not load kernel32.DLL.\nPlease check it's in your path"), MB_OK | MB_ICONEXCLAMATION);<br />
return FALSE;<br />
}<br />
<br />
lpfnProcess32First pFnProc32First = (lpfnProcess32First)GetProcAddress( hLib, "Process32First" );<br />
lpfnProcess32Next pFnProc32Next = (lpfnProcess32Next)GetProcAddress( hLib, "Process32Next" );<br />
lpfnTH32Snap pFnTH32Snap = (lpfnTH32Snap)GetProcAddress( hLib, "CreateToolhelp32Snapshot" );<br />
<br />
if ( (NULL == pFnProc32First) || (NULL == pFnProc32Next) || (NULL == pFnTH32Snap) )<br />
{<br />
AfxMessageBox(_T("Could not find procedure in Kernel32.DLL"), MB_OK | MB_ICONEXCLAMATION);<br />
FreeLibrary(hLib);<br />
return FALSE;<br />
}<br />
<br />
PROCESSENTRY32 pe;<br />
memset(&pe, NULL, sizeof(PROCESSENTRY32));<br />
<br />
HANDLE hSnapshot = pFnTH32Snap(TH32CS_SNAPPROCESS, 0);<br />
<br />
if (!hSnapshot)<br />
{<br />
AfxMessageBox(_T("Could not retrieve process snapshot"), MB_OK | MB_ICONEXCLAMATION);<br />
}<br />
<br />
pe.dwSize = sizeof(PROCESSENTRY32);<br />
<br />
if ( pFnProc32First(hSnapshot, &pe) )<br />
{<br />
MODULEENTRY32 me32 = {0}; <br />
BOOL bGotModule = FALSE; <br />
do<br />
{<br />
if ( GetProcessModule(pe.th32ProcessID, pe.th32ModuleID, &me32, sizeof(MODULEENTRY32), hLib) )<br />
{<br />
char szProcessName[MAX_PATH];<br />
memset(szProcessName, NULL, sizeof(char)*MAX_PATH);<br />
<br />
char drive[8];<br />
char dir[MAX_PATH]; <br />
char ext[8];<br />
_splitpath(me32.szExePath, drive, dir, szProcessName, ext);<br />
strcat(szProcessName, ext);<br />
<br />
if ( ItsOurProcess())<br />
{<br />
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE,<br />
FALSE, pe.th32ProcessID);<br />
if (hProcess)<br />
{<br />
<br />
TerminateProcess(hProcess, 0);<br />
<br />
CloseHandle(hProcess);<br />
}<br />
}<br />
}<br />
}<br />
while(pFnProc32Next(hSnapshot, &pe));<br />
}<br />
<br />
CloseHandle(hSnapshot);<br />
<br />
FreeLibrary(hLib);<br />
}<br />
else<br />
{<br />
AfxMessageBox(_T("Operating system does not support this application"), MB_OK | MB_ICONEXCLAMATION);<br />
}<br />
return FALSE;<br />
}
FYI ToolHelp works on both sets of platform so you could just use that
|