【问题标题】:terminating a process using process name [duplicate]使用进程名称终止进程[重复]
【发布时间】:2018-12-21 02:56:20
【问题描述】:

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

但是在编译时,我得到一个错误“error C2664: 'strcmp': cannot convert parameter 1 from 'WCHAR [260]' to 'const char *'” 关于这部分“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;
}    

【问题讨论】:

  • 以下是如何解决此错误的建议:访问 www.google.com 并搜索如何将 aWCHAR * 转换为 const char *。一公吨的点击量(其中很多都在这个自己的网站 stackoverflow.com 上,怎么样?)。阅读它们。

标签: c++ winapi terminate


【解决方案1】:

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

要解决此问题,您必须:

  • 直接调用 ANSI 版本的 API 函数,以匹配您的 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;
    } 
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多