TerminateProcess не работает в Windows 7 - PullRequest
2 голосов
/ 05 января 2011

Я пишу приложение на c ++ на платформе win7, которое должно закрыть другое приложение. Шаги, которые я использую:

  1. Перечислять все процессы с помощью EnumProcess ().
  2. Открыть дескриптор процесса с помощью OpenProcess (). Права доступа: PROCESS_ALL_ACCESS | PROCESS_VM_READ.
  3. Затем перечислите модули процесса с помощью EnumProcessModules ()
  4. Я извлекаю имя модуля с помощью GetModuleBaseName () и сравниваю его с именем процесса, который у меня есть.
  5. Когда я нахожу совпадение, я использую TerminateProcess (), чтобы завершить процесс.

Проблема, с которой я сталкиваюсь, заключается в том, что это работает в WindowsXP, но не в Windows 7 (64-разрядная версия). Используя getlasterror (), Я получаю ошибку как «Отказано в доступе». Я думаю, это как-то связано с правами доступа. Есть ли способ сделать это на обеих платформах? Или есть специфичный API для win7?

Ответы [ 2 ]

3 голосов
/ 20 апреля 2012

У меня была такая же проблема.Очень долго искал ответ и, наконец, нашел его.

Когда вы хотите завершить другую программу, вам нужен дескриптор.Дескриптору нужны разрешения для работы с другим процессом.Для завершения процесса необходимы специальные разрешения, которые называются PROCESS_TERMINATE.Используйте это при открытии ручки для завершения, и это, вероятно, будет работать.Это для меня, на Windows 7.

Подводя итог, здесь код, который вам нужно правильно использовать TerminateProcess.Обращаться с осторожностью;)

Declare Function OpenProcess Lib "kernel32" ( _
    ByVal dwDesiredAccess As Long, _
    ByVal bInheritHandle As Long, _
    ByVal dwProcessID As Long) As Long
Declare Function TerminateProcess Lib "kernel32.dll" ( _
    ByVal ApphProcess As Long, _
    ByVal uExitCode As Long) As Long

Const PROCESS_TERMINATE = &H1

Private Sub KillProcess(ByVal ProcessID As Long)
    Dim pHandle As Long
    pHandle = OpenProcess(PROCESS_TERMINATE, 0, ProcessID)
    Call TerminateProcess(pHandle, 0)
End Sub
1 голос
/ 05 января 2011

Запускаете ли вы вашу программу с правами администратора и завершаете ли вы обработку того же пользователя?

...