Почему нельзя выполнить «taskkill» из cmd в С++?

Я хочу выполнить taskkill из cmd в коде C++. Я пробовал две формы:

  1. Простая форма:
system("taskkill /IM 'example.exe' /F");
  1. С правами администратора (поскольку один из моих процессов имеет высокие права):
system("runas / profile / user:administrator \"taskkill /IM 'exmaple.exe' /F\"");

Также моя программа на С++ запускалась от имени администратора. Но ни одна из этих команд не выполнена успешно. В чем проблема?

Почему вы используете систему? Для этого в Windows есть метод API: learn.microsoft.com/en-us/windows/win32/api/processthreadsap‌​i/… .

Pepijn Kramer 30.01.2023 09:27

Попробуйте удалить одинарные кавычки вокруг файла example.exe: 'example.exe' -> example.exe.

wohlstad 30.01.2023 09:27

Вы пробовали запускать эти команды напрямую и смотреть, работают ли они?

chris 30.01.2023 09:35

Я имею в виду, что если вы используете API, вы сможете получить гораздо более точную информацию об ошибках и причинах сбоя.

Pepijn Kramer 30.01.2023 09:44

@wohlstand Спасибо, но результат не изменился.

sh.sagheb 30.01.2023 13:03

@chris Это было успешно

sh.sagheb 30.01.2023 13:06

@sh.sagheb это странно. Я запустил notepad.exe и попробовал (в терминале cmd.exe): taskkill /IM 'notepad.exe' /F и получил ERROR: The process "'notepad.exe'" not found.. Затем я попробовал taskkill /IM notepad.exe /F и у меня получилось (получил: SUCCESS: The process "notepad.exe" with PID ... has been terminated.). Это также сработало, когда я заключил notepad.exe в двойные кавычки ("). Но не в одинарных кавычках (').

wohlstad 30.01.2023 15:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Немедленным решением может быть удаление одинарных кавычек ('), заключающих example.exe.
Например. вместо:

system("taskkill /IM 'example.exe' /F");

Использовать:

system("taskkill /IM example.exe /F");

Использование двойных кавычек (" - в данном случае экранировано с помощью \) также допустимо:

system("taskkill /IM \"example.exe\" /F");

Однако -
Как прокомментировал выше @PepijnKramer, вы можете использовать специальные функции Windows API, чтобы сделать то же самое. Это требует немного больше кода, но предлагает гораздо лучший контроль и обратную связь об ошибках.

Вот схема того, что вам нужно сделать:

  1. Получите PID процесса по его имени (см. ниже).
  2. Откройте процесс с помощью OpenProcess API, чтобы получить к нему дескриптор с PROCESS_TERMINATE правами доступа (см. ниже).

Пример получения PID, а затем дескриптора процесса по его имени: Как я могу получить дескриптор процесса по его имени на C++?.

  1. Используйте дескриптор с TerminateProcess API, чтобы убить процесс. Обратите внимание, что для его использования:

Дескриптор должен иметь право доступа PROCESS_TERMINATE.

(это должно быть передано в OpenProcess через параметр dwDesiredAccess).

Другие вопросы по теме