Fork me on GitHub
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# 为例详细的介绍了两种强制结束进程的方式,经过严格的测试,以上代码均可以成功运行并完成相关的任务,但是值得一提的是,这种结束进程的方式就是传说中的下策,如果还有其他解决方案尽量不要采取这种方式结束进程,因为会导致相关的内存或者某些资源无法释放,建议只在程序安装或者升级使用这种方式。

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

C# and .Net Framework

 
摘要: 强制结束进程的两种实现方式--C#和C++实现最近在做一个大型的项目,由于进程之间的关联出了一些问题,长话短说,就是我们不得不强制停止某些进程以保证系统正常的运行,在网上找了一下,没发现有这方面详细的介绍和写的比较全面的文章,于是按照MSDN的说明写了两种方法,希望对遇到类似问题的朋友有所帮助。首先,我们来看看C#的实现方式, 由于C#对进程的封装比较好,所以我们只需要较少的语句就可以完成这个工作,值得强调的是参数有效性检测和名字比较,由于系统中可能运行很多意想不到的进程,所以在比较名字的时候一定要用等于而不是包含或者之比较开头和结尾,否则很可能杀错进程,相关代码如下。C# Code://Re阅读全文
posted @ 2012-04-17 18:25 SolidMango 阅读(639) | 评论 (4) 编辑
摘要: 经常发现有人在网上提出这样的问题,现实中也确实有不少人在经历了3-5年的Windows开发之后就开始迷失方向,每天浑浑噩噩混日子,可能是因为这个问题粒度太大,没人愿意花时间回答,希望本文可以抛砖引玉,给大家节省些时间,同时也希望园子里面的兄弟们能尽力的补充,从而使这篇文章可以帮助更多的后来人。 首先说明的是,本文提到的各种技术不分先后,没有顺序,虽然先学什么,再学什么对某些人来说可能更方便,但是这些都不是绝对的,因为每个人的情况不同。 Windows开发首先必须学习的就是操作系统的API,因为其他的一切都是构建于OS之上,所谓九层之台,起于垒土,如果你对linux的系统调用很熟悉就会发现其..阅读全文
posted @ 2011-11-26 10:45 SolidMango 阅读(3739) | 评论 (42) 编辑
摘要: 最近由于项目的关系,对Microsoft在各种编程语言中提供的TreeView控件做了一些研究。最初在网上查了一下,除了Microsoft的MSDN有些分散的knowledge, 并没有发现有这方面主题文章,于是有了写这篇文章的想法,希望可以抛砖引玉,让后来人少走些弯路。出于个人兴趣的关系,我主要对Microsoft Visual C++ 和C#两种语言中的TreeView控件进行了相应的研究,在这两种语言中,对于TreeView控件的基本用法本文不做说明,相对高级的用法主要是为TreeItem设置静态图标和选中图标,dragand drop操作,由于C#中的TreeView控件是所有微软提供阅读全文
posted @ 2011-11-16 13:52 SolidMango 阅读(1460) | 评论 (2) 编辑
摘要: 看到过园子里面几篇协变和逆变的文章,但是总觉得写得不够清晰,文章这东西注重要是要把自己想表达的观点表达出来,这个过程应该是把复杂的东西消化出来从而简单化,清晰化,而不是故弄玄虚,反其道而行之,下面我们言归正传啦。我们先来看一段MSDN原文给协变,逆变和变体下个定义:A generic interface or delegate is called variant if its generic parameters are declared covariant or contravariant. Both C# and Visual Basic enable you to create your阅读全文
posted @ 2011-11-09 13:32 SolidMango 阅读(3556) | 评论 (28) 编辑
摘要: 1.0--3.5sp1http://msdn.microsoft.com/zh-cn/library/ms171868(v=VS.90).aspx4.0http://msdn.microsoft.com/zh-cn/library/ms171868(v=VS.100).aspx阅读全文
posted @ 2011-10-11 19:20 SolidMango 阅读(74) | 评论 (0) 编辑
摘要: C# 语言规范没有定义编码标准。 但是,Microsoft 使用本主题中的这些指南开发示例和文档。 编码约定可实现以下目的:它们创建一致的代码外观,从而使读者可以关注内容而非布局。它们使读者能够根据以前的经验作出假设,从而更加快速地理解代码。有利于复制、更改和维护代码。演示 C# 最佳做法。命名约定 命名指南在 名称准则 中介绍。 您无需更改由 Visual Studio 设计器工具创建的对象的名称,就可以让它们符合指南。 在不包括 using 语句 的简短示例中,使用命名空间限定。 如果您知道默认情况下会将某命名空间导入项目中,则无需完全限定来自该命名空间的名称。 如果限定名称太长无法放入一阅读全文
posted @ 2011-10-10 21:15 SolidMango 阅读(43) | 评论 (0) 编辑
摘要: 1. Domain Login 验证用户权限publicboolValidateDomainUser(stringUserName,stringPassword,stringDomain){boolbValid=false;using(PrincipalContextcontext=newPrincipalContext(ContextType.Domain,Domain)){bValid=context.ValidateCredentials(UserName,Password);}returnbValid;}2. Domain Mode读取privatevoidDomainModeChec阅读全文
posted @ 2011-04-22 14:23 SolidMango 阅读(965) | 评论 (0) 编辑
摘要: 前提是程序以Any CPU 方式编译,我看到网上好多朋友判断系统位数的方式,又是P/Invoke,又是获取系统位宽,真的有必要么?以下是我认为最简单的一种方式,请朋友们给出更简单的方式,或者指出我的错误。if(IntPtr.Size==8){//64bit}elseif(IntPtr.Size==4){//32bit}else{//...NotSupport}请大家不吝赐教..阅读全文
posted @ 2011-03-28 15:09 SolidMango 阅读(3200) | 评论 (20) 编辑
摘要: 关键字:COM,.NET,互操作,封送 多年来在程序设计领域微软技术一直引领着每个时代,在每一代的技术背后都有相关的动机,而这些动机及其实现细节往往是大部分的程序设计课程没有涉及的,但是对于我们理解相关的技术又十分重要,本文将对几种相关技术和隐藏在动机背后的细节做简要的阐述,算是抛砖引玉。 COM技术于1993年首次发布,称得上是微软技术的一个里程碑,其意义在于使组件编程化得以实现。COM技术最初的思想起源于将类做成可重用的二进制组件,把类的实现和接口分离以便把类的实现封装到二进制防火墙的背后,而这道防火墙以VPTR和VTBL的形式保证了这个防火墙的不变性。.NET技术则在语言层面上支持了基于阅读全文
posted @ 2010-04-21 14:22 SolidMango 阅读(1313) | 评论 (6) 编辑

 

posted on 2012-04-17 21:23  HackerVirus  阅读(878)  评论(0编辑  收藏  举报