Wie kann man einen Prozess in C ++ (Win32) effektiv beenden?

9

Ich schreibe gerade ein sehr leichtgewichtiges Programm, deshalb muss ich C ++ verwenden, da es nicht an .NET Framework gebunden ist, was die Größe des Programms drastisch erhöht.

Ich muss in der Lage sein, den Prozess zu beenden, und dazu muss ich ein Prozess-Handle bekommen. Unglücklicherweise habe ich noch nicht herausgefunden, wie ich das machen soll.

P.S. Ich weiß, dass man zum Beenden eines Prozesses TerminateProcess verwenden muss.

    
Kristina Brooks 16.12.2009, 18:14
quelle

8 Antworten

12

Die PID, die Sie für OpenProcess () benötigen, ist normalerweise nicht leicht zu erreichen. Wenn Sie nur einen Prozessnamen haben, müssen Sie die laufenden Prozesse auf dem Computer wiederholen. Tun Sie dies mit CreateToolhelp32Snapshot, gefolgt von Process32First und Schleife mit Process32Next. Die PROCESSENTRY32.szExeFile gibt Ihnen den Prozessnamen (nicht Pfad!), Th32ProcessID gibt Ihnen die PID.

Die nächste Überlegung ist, dass der Prozess möglicherweise mehr als einmal angezeigt wird. Und es besteht die Möglichkeit, dass derselbe Prozessname für sehr unterschiedliche Programme verwendet wird. Wie "Setup". Wenn Sie nicht nur alle töten wollen, müssen Sie versuchen, einige Laufzeit-Informationen von ihnen zu erhalten. Fensterbeschriftungsleiste, vielleicht. GetProcessImageFileName () kann Ihnen den Pfad zu der EXE-Datei angeben. Wenn Sie das native Kernel-Format verwenden, müssen Sie QueryDosDevice den Laufwerksgerät-Namen einem Laufwerksbuchstaben zuordnen.

Die nächste Überlegung sind die Rechte, nach denen Sie in OpenProcess () fragen. Es ist unwahrscheinlich, dass du PROCESS_ALL_ACCESS bekommst, alles was du brauchst ist PROCESS_TERMINATE . Obwohl das auch privilegiert ist. Stellen Sie sicher, dass das Konto, das Sie zum Ausführen Ihres Programms verwenden, dieses Recht erhalten kann.

    
Hans Passant 16.12.2009, 19:00
quelle
10

Anstatt all diesen Schmerz durchzugehen, um einen Prozess mit einem bekannten Namen zu töten, warum rufen Sie nicht einfach "system" an und bitten Sie die Befehlszeile, es zu töten?

Zum Beispiel

%Vor%     
James Hugard 01.03.2012 20:00
quelle
5

Um ein Handle zu erhalten, das an TerminateProcess übergeben werden soll, verwenden Sie OpenProcess in Kombination mit anderen Funktionen wie EnumProcesses .

    
Jon Benedicto 16.12.2009 18:22
quelle
4
%Vor%

Das hat funktioniert

    
Kristina Brooks 16.12.2009 18:29
quelle
3

Hier ist das vollständige Beispiel für Visual Studio 2010 C ++ - Projekt, wie Sie den Prozess durch den EXE -Dateiname beenden können.

Um dies zu überprüfen, führen Sie einfach den Internet Explorer aus und führen Sie anschließend folgenden Code aus.

%Vor%

Stellen Sie sich vor, in C # sieht es wie

aus %Vor%     
Academy of Programmer 24.09.2015 20:12
quelle
1

CreateProcess und OpenProcess gibt Prozess-Handles zurück.

Hier finden Sie einige Beispielcode , um einen Prozess zu finden, indem Sie den System, um alle Prozesse aufzulisten und dann die Liste nach dem gewünschten Prozess zu durchsuchen.

    
Jason Orendorff 16.12.2009 18:19
quelle
0

Hier sind einige funktionierende Beispielcodes, um einen Prozess namens "ShoulBeDead.exe" zu beenden:

%Vor%     
laishiekai 17.07.2014 19:05
quelle
0

nur Fenster

%Vor%     
user3290207 02.03.2018 21:33
quelle

Tags und Links