2011-01-05 85 views
2

我正在用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

回答

1

您是否以管理員權限運行您的程序,並且您是否終止同一用戶的處理?

+0

我需要挖掘這個老問題,因爲我有類似的問題。我想用TerminateProcess來殺死一個32位的進程。這兩個應用程序都由同一個用戶啓動,並且該用戶具有管理員權限。我試圖添加一個清單來獲得更高的權限,但我沒有工作。如果任何人都可以使TerminateProcess函數在Windows 7上工作,請現在告訴我如何。 – Martin 2012-04-19 13:11:20

2

我有同樣的問題。一直在尋找答案,並最終找到答案。

當你想終止另一個程序時,你需要一個句柄。一個句柄需要與另一個進程一起工作的權限。終止該流程需要一個稱爲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 
相關問題