2

我正在win7平台上用c++编写一个应用程序,需要关闭另一个应用程序。我使用的步骤是:

  1. 使用 EnumProcess() 枚举所有进程。
  2. 使用 OpenProcess() 打开一个进程句柄。访问权限为 PROCESS_ALL_ACCESS|PROCESS_VM_READ。
  3. 然后使用 EnumProcessModules() 枚举流程模块
  4. 我使用 GetModuleBaseName() 提取模块名称并将其与我拥有的进程名称进行比较。
  5. 当我找到匹配项时,我使用 TerminateProcess() 来终止该进程。

我面临的问题是这适用于 WindowsXP,但不适用于 Windows 7(64 位)。使用 getlasterror(),我得到错误为“拒绝访问”。我想这与访问权限有关。有什么办法可以在两个平台上做到这一点?还是有特定于win7的API?

4

2 回答 2

3

我有同样的问题。找了很久的答案,终于找到了。

当你想终止另一个程序时,你需要一个句柄。句柄需要权限才能与其他进程一起工作。终止进程需要一个特定的权限,称为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
于 2012-04-20T12:20:00.020 回答
1

您是否以管理员权限运行您的程序,并且您是否正在终止对同一用户的处理?

于 2011-01-05T13:20:34.577 回答