# Windows Prozess killen mit C++



## pking (25. November 2004)

Huhu

 Ich möchte einen Prozess killen mit C++ - Wenn ich z.B jetzt test.exe gestartet habe und dann die exe mit den prozess kill öffne, soll test.exe gekillt werden!
 Hat jemand vielleicht ein bsp. Code?
 Das wäre Supii .

 MfG pking


----------



## Beichtpfarrer (25. November 2004)

Windows-Prozesse killt man nicht mit C++ sondern mit der WinApi.
TerminateProcess wär dazu ein gutes Stichwort.
Aber da das eine unsichere Methode ist (warum->msdn!) solltest du uU Interprozesskommunikation in Erwägung ziehen..
Mfg


----------



## BadMourning (28. November 2004)

du startest deinen Prozess mit CreateProcess, der dir eine Prozess-ID zurückgibt. Mit TerminateProcess kannst du den Prozess dann wieder killen.
Bei mir hat das noch immer gut funktioniert... 

Ich denke Beispielcode findest du in der MSDN... 
(http://www.microsoft.msdn.com)


----------



## Beichtpfarrer (29. November 2004)

BadMourning hat gesagt.:
			
		

> du startest deinen Prozess mit CreateProcess, der dir eine Prozess-ID zurückgibt. Mit TerminateProcess kannst du den Prozess dann wieder killen.
> Bei mir hat das noch immer gut funktioniert...
> 
> Ich denke Beispielcode findest du in der MSDN...
> (http://www.microsoft.msdn.com)



Musst dabei aber aufpassen:
Zum Beispiel werden mit dem Prozess verknüpfte Dlls nicht wieder freigegeben und können nicht mehr aus dem Speicher geladen werden.
Global allokierter Speicher (GlobalAlloc) wird auch nicht wieder freigegeben (denk ich jdf)
Usw... mit TerminateProcess sollte man eigentlich nur im Notfall arbeiten.
Vorzugsweise versucht man es mit WM_CLOSE-Messages, Interprocesskommunikation oder ähnlichem.


----------



## Cl3aner (7. Dezember 2004)

Ich habe zu dem Thema mal ne Frage.
Wie Beendet man einen Prozess dessen ID man nicht hat.
z.B.Ich möchte in einem Programm den Prozess "explorer.exe"
beenden. Wie mache ich das am einfachsen ?


----------



## BadMourning (8. Dezember 2004)

Man listet sich alle Prozesse die momentan laufen, so
bekommt man dann auch den gewünschten. Geht mit
EnumProcesses oder EnumWindows, je nachdem, was
man speziell braucht.

Mußt du mal in der MSDN nachschauen. Ist aber nicht 
unbedingt was für Anfänger!


----------



## Executer (8. Dezember 2004)

```
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

void printError( TCHAR* msg );
BOOL KillProcessByName(char *szProcessToKill);


int main()
{
KillProcessByName("Icq.exe");      // Anstatt Icq.exe halt "Test.exe" eingeben!
return 0;
}


BOOL KillProcessByName(char *szProcessToKill)
{
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
DWORD dwPriorityClass;

hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

if( hProcessSnap == INVALID_HANDLE_VALUE )
  {
    printError( "CreateToolhelp32Snapshot (of processes)" );
    return( FALSE );
  }

pe32.dwSize = sizeof( PROCESSENTRY32 );

if( !Process32First( hProcessSnap, &pe32 ) )
  {
    printError( "Process32First" );  
    CloseHandle( hProcessSnap );     
    return( FALSE );
  }

do{
    if(!strcmp(pe32.szExeFile,szProcessToKill))
  	{
  	printf("Prozess: %s \n",pe32.szExeFile);
  	printf("PID: %d \n",pe32.th32ProcessID );  
	hProcess = OpenProcess(PROCESS_TERMINATE,0, pe32.th32ProcessID);
	TerminateProcess(hProcess,0);
	CloseHandle(hProcess);
  	} 
  } while( Process32Next(hProcessSnap,&pe32) );


CloseHandle( hProcessSnap );
return( TRUE );
}

void printError( TCHAR* msg )
{
  DWORD eNum;
  TCHAR sysMsg[256];
  TCHAR* p;

  eNum = GetLastError( );
  FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
         NULL, eNum,
         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
         sysMsg, 256, NULL );

  // Trim the end of the line and terminate it with a null
  p = sysMsg;
  while( ( *p > 31 ) || ( *p == 9 ) )
    ++p;
  do { *p-- = 0; } while( ( p >= sysMsg ) &&
                          ( ( *p == '.' ) || ( *p < 33 ) ) );

  // Display the message
  printf( "\n  WARNING: %s failed with error %d (%s)", msg, eNum, sysMsg );
}
```


hab ihc in einem anderen board gefunden
hoffe das hilft dir

mfg


----------



## pking (8. Dezember 2004)

wunderbar danke


----------



## Cl3aner (9. Dezember 2004)

Ich bedanke mich auch.
Das war genau das, was ich gesucht habe.


----------



## pking (18. Dezember 2004)

funtkioniert wunderbar


----------



## soulfly79 (6. Juli 2005)

@executer
ich danke dir ebenfalls für den Beitrag. Hab ne halbe Ewigkeit nach dieser Lösung gesucht....


----------



## jakix (1. Juni 2007)

hallo,

ich hätte noch eine Frage zu der Funktion ? Ich habe sie eingebaut aber das funkt nur bei XP   und nicht bei Win2000.
Muss man da noch was beachten ?

grüss Jakix


----------



## supersass1 (4. November 2007)

ja ich glaube schon, WinXP verfügt über zusätzliche .dlls die Win2000 nicht hat. Ich glaube in diesem Fall ist es die kernel32.dll, bin mir aber nicht sicher.


----------

