2012-07-05 103 views
2

我在寫一個C++ QT桌面應用程序,打算在Windows操作系統上運行。
此應用程序應列舉所有正在運行的進程,並將殺死特定進程(按名稱識別)。有兩種方法我知道這樣做:有效殺死Windows進程

  1. 使用Windows API。
  2. 使用tasklist命令獲取過程,taskkill結束該進程。

哪個選項是在代碼風格,效率和性能方面比較好?還是有第三種選擇?

+5

效率和性能是沒有意義的用於一次性操作。 – Jon

+0

我在Java上遇到了此代碼的性能問題。因爲我在應用程序啓動過程中進行了三次枚舉...... – sara

+0

只是很好,但爲什麼你在開始時要枚舉三次呢? –

回答

5

效率和性能不應該擔心你,IMO。你可能不會每秒殺死1000個進程,所以如果一個需要10ms,另一個需要100ms,我懷疑有人會關心。

所以,選擇其他的一個論據主要是簡化編程和維護。用於枚舉進程的API不是最簡單的,但您可以在Web上找到很多示例(如here)。使用任務列表將需要獲取輸出並解析它。

我會去爲這些原因,API:

  1. 你可以得到的情況下,操作失敗的更多信息。你會確切地知道問題出在哪裏,它是什麼。
  2. 我不知道tasklisttaskkill保證是每個Windows機器上。他們會隨操作系統一起提供,但有人可能會認爲他們擴大了攻擊面或其他任何東西,並將其刪除。
  3. 解析文本很容易出錯。我不知道,例如,如果tasklist的輸出取決於操作系統區域設置。你做?
0

當然可以用WINAPI ,你使用Windows Api。這比使用外部exe來殺死進程要好得多。 你可以使用OpenProcess來獲得進程句柄,這需要你一個進程ID。一旦你打開你可以使用TerminateProcess給出一個進程句柄。

+0

你能否在你的陳述背後聲明「是更好的......」我不否認它 - 只是提出一種改進答案的方法。 –

+0

一個原因是,如果你可以用幾行代碼來做到這一點,爲什麼你應該依賴一些外部的lib/dll。 – crypted