在Visual C 應用程式中徹底清除程序

2021-04-02 10:32:25 字數 1579 閱讀 2186

[ 一]

讀者朋友們可能經常會碰到這樣乙個問題,想對某些進行操作時,發現這些檔案正在被其它程式使用,處於開啟狀態,而且是被獨佔開啟,這時是沒法對檔案進行操作的。因此,要想操作這些檔案,必須將開啟這些檔案的程序清除掉。那麼如何乾淨地清除程序呢?其實,在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()函式,其引數**to_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下程序的控制也是有借鑑意義的。

Visual C 中呼叫其他應用程式的方法(函式)

本文所有程式在visual studio.net 2003 c 環境下編寫,編譯過程沒有錯誤。現在都使用visual studio 2005了。不知道還能編譯通過不 三個sdk函式winexec,shellexecute,createprocess實現呼叫其他程式的方法 visual c中呼叫其他應...

理解 Visual C 應用程式的依賴項

確定您的應用程式依賴哪些 visual c 庫的一種方式是 檢視您專案的 專案設定 對話方塊中的 常規 選項卡。例如,您可能看到專案使用的是 mfc 和 atl 庫。如果選擇了 在動態庫中使用 mfc 則您的應用程式在執行時將依賴 mfc dll 如 mfc80.dll 如果您的應用程式不使用 mf...

在應用程式中宿主MEF

在應用程式中宿主mef其實非常簡單,只需要建立乙個組合容器物件 compositioncontainer 的例項,然後將需要組合的部件 parts 和當前宿主程式新增到容器中即可。首先需要新增mef框架的引用,既system.componentmodel.composition.dll,詳細如下 塊...