使用进程名称终止进程

terminating a process using process name

本文关键字:终止 进程 进程名      更新时间:2023-10-16

我一直在尝试创建一个程序,该程序将使用进程名称终止进程。搜索后,API CreateToolhelp32Snapshot,Process32First,OpenProcess和TerminateProcess将帮助我完成此程序。

但是在编译时,我收到一个错误"错误 C2664:'strcmp':无法将参数 1 从'WCHAR [260]'转换为'常量字符 *'"关于这部分 "if (strcmp(pEntry.szExeFile, filename) == 0)"

关于如何解决此错误的任何建议?

谢谢!

#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <Tlhelp32.h>
#include <winbase.h>
#include <string.h>
void killProcessByName(const char *filename)
{
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    PROCESSENTRY32 pEntry;
    pEntry.dwSize = sizeof (pEntry);
    BOOL hRes = Process32First(hSnapShot, &pEntry);
    while (hRes)
    {
        if (strcmp(pEntry.szExeFile, filename) == 0)
        {
            HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,
                                      (DWORD) pEntry.th32ProcessID);
            if (hProcess != NULL)
            {
                TerminateProcess(hProcess, 9);
                CloseHandle(hProcess);
            }
        }
        hRes = Process32Next(hSnapShot, &pEntry);
    }
    CloseHandle(hSnapShot);
}
int main()
{
    killProcessByName("calc.exe");
    return 0;
}    

您正在编译启用了 Unicode 的项目,因此您调用的基于 TCHAR 的 API 函数将映射到它们的 Unicode 版本(Process32First() -> Process32FirstW()Process32Next() -> Process32NextW() ),因此pEntry.szExeFile将是一个wchar_t[]而不是char[]。 但是strcmp()只接受char*字符串作为输入。这就是编译器所抱怨的,您在预期char*的地方传递了一个wchar_t[]

要解决此问题,您必须:

  • 直接调用 API 函数的 ANSI 版本,以匹配 ANSI filename参数。

    void killProcessByName(const char *filename)
    {
        HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
        if (!hSnapShot) return;
        PROCESSENTRY32A pEntry;
        pEntry.dwSize = sizeof (pEntry);
        BOOL hRes = Process32FirstA(hSnapShot, &pEntry);
        while (hRes)
        {
            if (strcmp(pEntry.szExeFile, filename) == 0)
            {
                HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, pEntry.th32ProcessID);
                if (hProcess)
                {
                    TerminateProcess(hProcess, 9);
                    CloseHandle(hProcess);
                }
            }
            hRes = Process32NextA(hSnapShot, &pEntry);
        }
        CloseHandle(hSnapShot);
    }
    int main()
    {
        killProcessByName("calc.exe");
        return 0;
    }
    
  • filename 参数更改为 wchar_t* 以匹配 Unicode 函数,并使用 wcscmp() 而不是 strcmp()

    void killProcessByName(const wchar_t *filename)
    {
        HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
        if (!hSnapShot) return;
        PROCESSENTRY32W pEntry;
        pEntry.dwSize = sizeof (pEntry);
        BOOL hRes = Process32FirstW(hSnapShot, &pEntry);
        while (hRes)
        {
            if (wcscmp(pEntry.szExeFile, filename) == 0)
            {
                HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, pEntry.th32ProcessID);
                if (hProcess)
                {
                    TerminateProcess(hProcess, 9);
                    CloseHandle(hProcess);
                }
            }
            hRes = Process32NextW(hSnapShot, &pEntry);
        }
        CloseHandle(hSnapShot);
    }
    int main()
    {
        killProcessByName(L"calc.exe");
        return 0;
    }