关闭

强制结束进程的两种实现方式--C#和C++实现

发表于:2012-10-29 10:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:ghevinn    来源:51Testing软件测试网采编

  最近在做一个大型的项目,由于进程之间的关联出了一些问题,长话短说,就是我们不得不强制停止某些进程以保证系统正常的运行,在网上找了一下,没发现有这方面详细的介绍和写的比较全面的文章,于是按照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#为例详细的介绍了两种强制结束进程的方式,经过严格的测试,以上代码均可以成功运行并完成相关的任务,但是值得一提的是,这种结束进程的方式就是传说中的下策,如果还有其他解决方案尽量不要采取这种方式结束进程,因为会导致相关的内存或者某些资源无法释放,建议只在程序安装或者升级使用这种方式。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号