Program C WinAPI sederhana untuk menghentikan proses melalui nama gambar proses
Aug 20 2020
(Juga, lihat iterasi berikutnya .)
Saya memiliki program kecil ini untuk menghentikan proses melalui masing-masing nama gambar proses ( .exe
file):
#include <stdio.h>
#include <windows.h>
#include <TlHelp32.h>
int main(int argc, char* argv[]) {
if (argc != 2) {
puts("processkiller.exe PROCESS_NAME");
return EXIT_SUCCESS;
}
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry) == TRUE) {
while (Process32Next(snapshot, &entry) == TRUE) {
if (strcmp(entry.szExeFile, argv[1]) == 0) {
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,
FALSE,
entry.th32ProcessID);
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
}
}
}
CloseHandle(snapshot);
return EXIT_SUCCESS;
}
Perhatikan bahwa Anda perlu menjalankan processkiller.exe
dalam mode administrator untuk benar-benar menghentikan proses yang diminta.
Permintaan kritik
Tolong beritahu saya apapun yang terlintas dalam pikiran saya.
Jawaban
4 MartinR Aug 20 2020 at 19:37
Ada bug halus:
Process32First(snapshot, &entry)
sudah terisi entry
dengan informasi tentang proses pertama dalam snapshot. Kode Anda melewatkan entri itu karena Process32Next()
dipanggil segera. Struktur lingkaran seharusnya
if (Process32First(snapshot, &entry) == TRUE) {
do {
// ... do something with `entry`...
} while (Process32Next(snapshot, &entry) == TRUE);
}
sebagai gantinya. Hal lain yang muncul di benak saya:
- Jika program dipanggil dengan jumlah argumen yang salah maka pesan kesalahan / penggunaan harus dicetak ke kesalahan standar dan program harus diakhiri dengan kode keluar bukan nol , misalnya
EXIT_FAILURE
. - Nilai kembalian
CreateToolhelp32Snapshot()
tidak dicentang. PROCESS_ALL_ACCESS
tidak diperlukan dalam panggilan keOpenProcess
, hanyaPROCESS_TERMINATE
.- Nilai kembalian
OpenProcess()
danTerminateProcess()
tidak dicentang. Saya mengharapkan pesan diagnostik jika gagal. Secara khusus,TerminateProcess()
danCloseHandle()
hanya boleh dipanggil jikaOpenProcess()
berhasil. - Ini mungkin masalah selera, tapi
== TRUE
bisa dihilangkan saat memeriksa kondisi boolean. - Sebagai pengguna alat ini, saya mengharapkan beberapa umpan balik untuk melihat apakah proses pencocokan ditemukan, dan berapa banyak proses yang mati.
Selalu Menjadi Ancaman: Mengapa Orang Berkulit Coklat dan Hitam Tidak Bisa Nyaman di Amerika Serikat
Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'