【问题标题】:TerminateProcess not working in Windows 7TerminateProcess 在 Windows 7 中不起作用
【发布时间】:2011-06-04 00:11:52
【问题描述】:

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

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

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

【问题讨论】:

  • 我想您已经排除了向其他应用程序发送 WM_QUIT message 的可能性?
  • 或WM_CLOSE到主窗口?
  • 嘿嘿,改了权限,又调试了一番,终于找到问题所在了。似乎 EnumProcessModules 失败了,因为我试图从 32 位进程中枚举 64 位进程的模块。错误代码是 299。我需要 EnumProcessModules 以独立于平台的方式(win7/winxp 等,仅 windows)查找具有给定名称的进程的 pid。除了使用系统命令之外,我什么也找不到。是的,我尝试了 WM_QUIT,但问题仍然存在。我无法找到具有给定名称的进程的 pid。

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


【解决方案1】:

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

当你想终止另一个程序时,你需要一个句柄。句柄需要权限才能与其他进程一起工作。终止进程需要名为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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我需要挖掘这个老问题,因为我有类似的问题。我想使用 TerminateProcess 杀死一个 32 位进程。这两个应用程序都由同一用户启动,并且该用户具有管理员权限。我曾尝试添加清单以获得更高的权限,但我没有工作。如果有人可以让 TerminateProcess 函数在 Windows 7 上运行,请告诉我如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多