завершение процесса с использованием имени процесса

Я пытался создать программу, которая завершит процесс, используя имя процесса. При поиске API CreateToolhelp32Snapshot, Process32First, OpenProcess и TerminateProcess помогут мне в выполнении этой программы.

Но при компиляции я получил ошибку "ошибка C2664: 'strcmp': невозможно преобразовать параметр 1 из 'WCHAR [260]' в 'const char *'" В этой части "if (strcmp(pEntry.szExeFile, имя файла) == 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;
}    

person frrelmj    schedule 21.12.2018    source источник
comment
Вот предложение, как решить эту ошибку: зайдите на www.google.com и найдите, как преобразовать aWCHAR * в const char *. Метрическая тонна просмотров (многие из них на этом собственном сайте, stackoverflow.com, как насчет этого?). Читать их.   -  person Sam Varshavchik    schedule 21.12.2018


Ответы (1)


Вы компилируете свой проект с включенным Unicode, поэтому вызываемые вами функции API на основе TCHAR будут отображаться в их версиях 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;
    } 
    
person Remy Lebeau    schedule 21.12.2018