TerminateProcess在Windows 7中不起作用

问题描述:

我正在用win7平台上的C++编写一个应用程序,它需要关闭另一个应用程序。 我使用的步骤是:TerminateProcess在Windows 7中不起作用

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

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

+0

我想你已经排除了简单地发送一个['WM_QUIT'消息](http://msdn.microsoft.com/en-us/library/ms632641的可能性。 aspx)到其他应用程序? – 2011-01-05 13:16:21

+0

或WM_CLOSE到主窗口? – 2011-01-05 18:18:44

+0

嘿,在更改权限和更多调试后,我终于找出问题所在。看来,EnumProcessModules失败,因为我试图从32位进程枚举64位进程的模块。错误代码是299.我需要EnumProcessModules以独立于平台的方式(win7/winxp等,只有Windows)以给定名称查找进程的pid。除了使用系统命令外,我无法找到任何东西。 是的,我尝试了WM_QUIT,但问题在这里保持不变。我无法找到具有给定名称的进程的PID。 – Amar 2011-01-08 06:21:42

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

+0

我需要挖掘这个老问题,因为我有类似的问题。我想用TerminateProcess来杀死一个32位的进程。这两个应用程序都由同一个用户启动,并且该用户具有管理员权限。我试图添加一个清单来获得更高的权限,但我没有工作。如果任何人都可以使TerminateProcess函数在Windows 7上工作,请现在告诉我如何。 – Martin 2012-04-19 13:11:20

我有同样的问题。一直在寻找答案,并最终找到答案。

当你想终止另一个程序时,你需要一个句柄。一个句柄需要与另一个进程一起工作的权限。终止该流程需要一个称为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