โปรแกรม 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ไม่จำเป็นต้องใช้ในการเรียกร้องให้เท่านั้นOpenProcessPROCESS_TERMINATE
  • ค่าที่ส่งคืนของOpenProcess()และTerminateProcess()ไม่ได้รับการตรวจสอบ ฉันคาดว่าจะได้รับข้อความวินิจฉัยหากล้มเหลว โดยเฉพาะอย่างยิ่งTerminateProcess()และCloseHandle()ควรถูกเรียกใช้หากOpenProcess()ประสบความสำเร็จเท่านั้น
  • อาจเป็นเรื่องของรสชาติ แต่== TRUEสามารถละเว้นได้เมื่อตรวจสอบเงื่อนไขบูลีน
  • ในฐานะผู้ใช้เครื่องมือนี้ฉันคาดหวังคำติชมเพื่อดูว่าพบกระบวนการจับคู่หรือไม่และมีกี่กระบวนการที่ถูกฆ่า