โปรแกรม C WinAPI อย่างง่ายสำหรับการยุติกระบวนการผ่านชื่อภาพกระบวนการ
Aug 20 2020
(ดูการทำซ้ำถัดไปด้วย)
ฉันมีโปรแกรมขนาดเล็กนี้สำหรับการยุติกระบวนการโดยใช้ชื่อรูปภาพกระบวนการ ( .exe
ไฟล์) ตามลำดับ:
#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;
}
โปรดทราบว่าคุณต้องเรียกใช้processkiller.exe
ในโหมดผู้ดูแลระบบเพื่อยุติกระบวนการที่ร้องขอจริงๆ
คำขอวิจารณ์
โปรดบอกฉันทุกอย่างที่อยู่ในใจ
คำตอบ
4 MartinR Aug 20 2020 at 19:37
มีข้อบกพร่องเล็กน้อย:
Process32First(snapshot, &entry)
กรอกentry
ข้อมูลเกี่ยวกับกระบวนการแรกในสแนปชอตแล้ว รหัสของคุณพลาดรายการนั้นเนื่องจากProcess32Next()
ถูกเรียกทันที โครงสร้างลูปควรเป็น
if (Process32First(snapshot, &entry) == TRUE) {
do {
// ... do something with `entry`...
} while (Process32Next(snapshot, &entry) == TRUE);
}
แทน. สิ่งอื่น ๆ ที่อยู่ในใจของฉัน:
- หากโปรแกรมที่เรียกว่ามีจำนวนที่ไม่ถูกต้องของการขัดแย้งแล้วเกิดข้อผิดพลาด / การใช้งานควรจะพิมพ์กับข้อผิดพลาดมาตรฐานและโปรแกรมควรยุติด้วยไม่ใช่ศูนย์
EXIT_FAILURE
รหัสทางออกเช่น CreateToolhelp32Snapshot()
ไม่ได้ตรวจสอบค่าส่งคืนของPROCESS_ALL_ACCESS
ไม่จำเป็นต้องใช้ในการเรียกร้องให้เท่านั้นOpenProcess
PROCESS_TERMINATE
- ค่าที่ส่งคืนของ
OpenProcess()
และTerminateProcess()
ไม่ได้รับการตรวจสอบ ฉันคาดว่าจะได้รับข้อความวินิจฉัยหากล้มเหลว โดยเฉพาะอย่างยิ่งTerminateProcess()
และCloseHandle()
ควรถูกเรียกใช้หากOpenProcess()
ประสบความสำเร็จเท่านั้น - อาจเป็นเรื่องของรสชาติ แต่
== TRUE
สามารถละเว้นได้เมื่อตรวจสอบเงื่อนไขบูลีน - ในฐานะผู้ใช้เครื่องมือนี้ฉันคาดหวังคำติชมเพื่อดูว่าพบกระบวนการจับคู่หรือไม่และมีกี่กระบวนการที่ถูกฆ่า