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

摘要:
有两种方法可以强制结束进程——C#和C++实现。最近,一个大型项目已经完成。由于过程之间的关联,存在一些问题。长话短说,我们必须强制停止一些进程,以确保系统的正常运行。在互联网上搜索后,我们没有找到关于这方面的详细介绍和全面文章,因此我们根据MSDN的说明编写了两种方法,希望对有类似问题的朋友有所帮助。

强制结束进程的两种实现方式--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) 编辑
 

免责声明:文章转载自《C#和C++实现强制结束进程的两种实现方式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mac keymap -&amp;gt;Default for macOS 常用快捷键说明PHP 基础下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#中的String类2

                          深入C# String类 C#中的String类 他是专门处理字符串的(String),他在System的命名空间下,在C#中我们使用的是string 小写的string只是大写的String的一个别名(外号)使用大写和小写都是一样的 Using  == import 常用的字符串处理法 Java中常用的...

C#远程调用技术WebService修炼手册

一、课程介绍 一位伟大的讲师曾经说过一句话:事物存在即合理!意思就是说:任何存在的事物都有其存在的原因,存在的一切事物都可以找到其存在的理由,我们应当把焦点放在因果关联的本质上。所以在本次分享课开课之前,我们要“约法三章”不谈论以下几个比较“严肃”和“敏感”的话题:WebService已经过时了啦,学习它干什么用啊!为什么要用WebService,而不用...

__cplusplus的用法(转)

经常在/usr/include目录下看到这种字句: #ifdef __cplusplusextern "C" {#endif...#ifdef __cplusplus}#endif 不太明白是怎么用的。今天阅读autobook,在第53页看到了作者的解释:C/C++编译器对函数和变量名的命名方法不一样(例如C++中重载的函数有多个名字,而C的函数只有一个...

解决c# md5与php md5加密不一致的问题(md5(unicode))

最近在做一个项目,客户是用c#编写的桌面应用程序,他在后台添加用户,需要我用php做一款app实现用户的一些基本功能。 首先是登陆,客户直接添加的用户密码采用了md5加密方式,我在app登陆的时候取出数据进行验证,验证密码的时候,一直提示密码不正确,于是我打印出php md5('123456') :md5: e10adc3949ba59abbe56e057...

【转帖】C++编译原理 资料

转自:http://blog.csdn.net/shiwenbin333/article/details/5157797 首先是预编译,这一步可以粗略的认为只做了一件事情,那就是“宏展开”,也就是对那些#***的命令的一种展开。       例如define MAX 1000就是建立起MAX和1000之间的对等关系,好在编译阶段进行替换。       例如...

C#基础(六)——值类型与引用类型

CLR支持两种类型:值类型和引用类型。 值类型包括C#的基本类型(用关键字int、char、float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型);而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类)等。 C#中的每一种类型要么是值类型,要么是引用类型。所以每个对象要么是值...