用Visual C 乾乾淨淨地清除程序

2021-08-24 23:50:11 字數 1564 閱讀 7768

讀者朋友們可能經常會碰到這樣乙個問題,想對某些進行操作時,發現這些檔案正在被其它程式使用,處於開啟狀態,而且是被獨佔開啟,這時是沒法對檔案 進行操作的。因此,要想操作這些檔案,必須將開啟這些檔案的程序清除掉。那麼如何乾淨地清除程序呢?其實,在windows2000作業系統版本中有乙個 工具程式叫tskill.exe,用它就可以清除掉某個程式的程序,在輸入"tskill 程式名"後就可以清除其執行例項。但是如何要在**裡實現tskill的功能該如何做呢?針對這一問題,本例項介紹了在windows2000下實現的方 法。

一、實現方法

在visual c++程式設計中,最安全的殺死程序的方法是向執行程式的主視窗傳送wm_close訊息,其實現**如下:

hwnd hwnd =this.m_hwnd; // 獲得主視窗

postmessage(hwnd, wm_close, 0, 0);

傳送此訊息後,通常應該等待直到程序確實終止,當程序終止時,它發出狀態訊號,並且 waitforsingleobject 返回wait_object_0。如果返回別的值,程序要麼掛起了,要麼仍然在進行處理。在這種情況下,殺死這個程序的唯一方法是用功能更強大的api函 數:terminateprocess()。如果想幹得漂亮一點,可以在關閉之前向主視窗傳送乙個wm_queryendsession訊息,當使用者結束 會話(log out)或者呼叫exitwindows()函式時,應用程式會收到這個訊息,然後準備退出程序,此時一般都會彈出乙個確認對話方塊,告訴使用者:"程式要推 出了,如果要儲存修改的東西,現在是最佳時機,想儲存嗎?"有三種選擇(yes/no/cancel)。此外,傳送wm_queryendsession 訊息可以拒絕推出程序(按下"cancel鍵"),如果是這樣,程序將會延續。

如果想要關閉的程序被掛起,使用 sendmessagetimeout()函式就非常重要,而不是用sendmessage()函式,其引數 smto_notimeoutifnothung是乙個只有windows 2000 和windows xp才有的標誌。其意義是"如果執行緒沒有掛起,不要超時",換句話說就是如果執行緒正在進行正常處理,那麼永遠等待,以便使用者能看到對話方塊並決定做什麼,當 使用者最終做出決定後,sendmessagetimeout()將帶著相應的boktokill值返回。

本例為了增強**的可重用性,將實現細節都封裝在乙個叫cfindkillprocess的類中,包括查詢和殺死程序,詳情請參見 enumproc.h和enumproc.cpp檔案。檔案中還有另外兩個可重用類,乙個是cprocessiterator,另乙個是 cwindowiterator。這在例項《獲取程序的主視窗以及建立程序的程式名》中有過詳細的敘述。

二、程式設計步驟

1、 啟動visual c++6.0,生成乙個控制台應用程式,將該程式命名為"kp";

2、 在程式**中新增cfindkillprocess、cprocessiterator類的定義;

3、 新增**,編譯執行程式。

三、程式**

四、小結

本例項通過介紹cfindkillprocess類**了在windows2000下徹底消除程序的方法,雖然該程式只能在windows2000環境下編譯執行,但是該方法對windows98下程序的控制也是有借鑑意義的。

乾乾淨淨殺死程序

最近在寫程式時碰到這樣乙個問題 我想將檔案備份到網路驅動器上,但是有一些檔案正在被其它程式使用,處於開啟狀態,而且是被獨佔開啟,這時是沒法對檔案進行備份操作的。因此,要想備份這些檔案,必須將開啟它們的那些程序kill掉。那麼如何乾淨地殺死這些開啟檔案的程序呢?相信看完本文後,自然會有辦法解決!其實,...

Oracle 10g 如何刪除乾乾淨淨!

oracle資料庫解除安裝非常麻煩,經常解除安裝不徹底,導致重新裝oracle非常麻煩,針對不同的平台需要不同的方法。一 linux 平台 linux 平台下解除安裝oracle 非常簡單,即 刪除oracle安裝目錄下的所有檔案和資料夾即可。二 windows 平台 因為oracle在window...

沒過多少時間就把地板拖得乾乾淨淨

從思想上的生活 今天的從思想上的生活,你們要繼續向前衝,我來幫媽媽做家務吧,思想等,我也不例外,爭取更好的成績,整個房間都亂七八糟,沒過多少時間就把地板拖得乾乾淨淨,遊客們都不約而同地俯視池中,我又乘著船來到了湖心亭。我想,其實質是鼓勵考生創新,只要有吃的生活就可以了,只見媽媽坐在房裡看電視,爸爸沒...