windows-7 - TerminateProcess 在 Windows 7 中不起作用

标签 windows-7 windows-xp process windows-7-x64

我正在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吗?

最佳答案

我也遇到了同样的问题。一直在寻找答案,终于找到了。

当你想终止另一个程序时,你需要一个句柄。句柄需要权限才能与其他进程一起使用。终止进程需要名为 PROCESS_TERMINATE 的特定权限。打开 handle 进行终止时使用它,它可能会起作用。它在 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

关于windows-7 - TerminateProcess 在 Windows 7 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4604295/

相关文章:

sql - 在 IBM netezza aginity workbench 中更改表名时出错

java - 在 Windows XP 上安装 JDK8 - advapi32.dll 错误

windows-vista - 为什么要使用 64 位操作系统?

python - 很好地终止后台python脚本

algorithm - 抢占式最短作业优先排序

php - 在 windows 7 64 位上带有 php 的 MongoDb

c++ - 用于检测启动了哪些程序的后台脚本

vb.net - Windows 用户名和密码

c++ - CUDA 链接错误 - Visual Express 2008 - 由于(空)配置文件导致 nvcc 致命

javascript - 在node.js进程之间读取-共享巨大的哈希值