使用进程名称终止进程

时间:2018-12-21 02:56:20

标签: c++ winapi terminate

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

但是在编译时,出现错误“错误C2664:'strcmp':无法将参数1从'WCHAR [260]'转换为'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;
}    

1 个答案:

答案 0 :(得分:0)

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

要解决此问题,您将必须:

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

    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以匹配Unicode函数,并使用wchar_t*代替wcscmp()

    strcmp()
相关问题