強制結束進程的兩種實現方式--C#和C++實現


強制結束進程的兩種實現方式--C#C++實現

 

最近在做一個大型的項目,由於進程之間的關聯出了一些問題,長話短說,就是我們不得不強制停止某些進程以保證系統正常的運行,在網上找了一下,沒發現有這方面詳細的介紹和寫的比較全面的文章,於是按照MSDN的說明寫了兩種方法,希望對遇到類似問題的朋友有所幫助。

 

首先,我們來看看C#的實現方式, 由於C#對進程的封裝比較好,所以我們只需要較少的語句就可以完成這個工作,值得強調的是參數有效性檢測和名字比較,由於系統中可能運行很多意想不到的進程,所以在比較名字的時候一定要用等於而不是包含或者之比較開頭和結尾,否則很可能殺錯進程,相關代碼如下。

 

 

C# Code:

//Return true for successful and false for failed

public bool FindAndKillProcessByName(string name)

{

            //Parameter check

            if (0 == name.Length)

            {

                return false;

            }

 

            //Find the named process and terminate it

            foreach (Process winProc in Process.GetProcesses())

            {

 

                //use equals for the task in case we kill

                //a wrong process

                if (winProc.ProcessName.Equals(name))

                {

                    winProc.Kill();

                    return true;

                }

            }

            return false;

}

 

使用C++完成相同的工作就需要相對多幾行代碼,首先是取得當前系統中所有進程的快照,完成這個工作的函數是CreateToolhelp32Snapshot(),在頭文件#include<tlhelp32.h>中,調用這個函數並返回有效的句柄之后我們需要在這個快照中查找我們想要結束的進程,值得一提的是Process32First(), Process32Next()這兩個函數的邏輯請仔細看代碼,否則很可能漏掉某個進程而導致錯誤,另外就是OpenProcess()網上很多文章說打開進程需要SEDebug權限,其實是不需要的,只要我們傳入PROCESS_TERMINATE 作為參數就可以成功的打開進程。

 

 

C++ Code:

BOOL FindAndKillProcessByName(LPCTSTR strProcessName)

{

        if(NULL == strProcessName)

        {

                return FALSE;

        }

        HANDLE handle32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

        if (INVALID_HANDLE_VALUE == handle32Snapshot)

        {

                        return FALSE;

        }

 

        PROCESSENTRY32 pEntry;       

        pEntry.dwSize = sizeof( PROCESSENTRY32 );

 

        //Search for all the process and terminate it

        if(Process32First(handle32Snapshot, &pEntry))

        {

                BOOL bFound = FALSE;

                if (!_tcsicmp(pEntry.szExeFile, strProcessName))

                {

                        bFound = TRUE;

                        }

                while((!bFound)&&Process32Next(handle32Snapshot, &pEntry))

                {

                        if (!_tcsicmp(pEntry.szExeFile, strProcessName))

                        {

                                bFound = TRUE;

                        }

                }

                if(bFound)

                {

                        CloseHandle(handle32Snapshot);

                        HANDLE handLe =  OpenProcess(PROCESS_TERMINATE , FALSE, pEntry.th32ProcessID);

                        BOOL bResult = TerminateProcess(handLe,0);

                        return bResult;

                }

        }

 

        CloseHandle(handle32Snapshot);

        return FALSE;

}

 

總結

本文以C++ C# 為例詳細的介紹了兩種強制結束進程的方式,經過嚴格的測試,以上代碼均可以成功運行並完成相關的任務,但是值得一提的是,這種結束進程的方式就是傳說中的下策,如果還有其他解決方案盡量不要采取這種方式結束進程,因為會導致相關的內存或者某些資源無法釋放,建議只在程序安裝或者升級使用這種方式。

還是那句話:如果你知道自己在干什么,你什么都可以做,加油!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM