首页建站terminateprocess(如何使用terminateprocess函数终止进程)

terminateprocess(如何使用terminateprocess函数终止进程)

编程之家2024-06-02121次浏览

一、为什么TerminateProcess不能结束进程解决思路

STARTUPINFO StartupInfo;//定义STARTUPINFO结构指针 memset(&StartupInfo,0,sizeof(STARTUPINFO)); StartupInfo.cb= sizeof(STARTUPINFO); StartupInfo.dwFlags=STARTF_USESHOWWINDOW; StartupInfo.wShowWindow=SW_SHOW; PROCESS_INFORMATION ProcessInfo; if(!CreateProcess("D:\\Program Files\\Fluent.Inc\\ntbin\\ntx86\\gambit.exe", cmdline.GetBuffer(cmdline.GetLength()),NULL,NULL,FALSE,0,NULL,"E:\\zuoye\\gambit1",&StartupInfo,&ProcessInfo)){cout<<"Create Fail!"<<endl;exit(1);}else{cout<<"Success!"<<endl;} WaitForSingleObject(ProcessInfo.hProcess,INFINITE);}void main(){gambit();HANDLE han=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//取进程快照 PROCESSENTRY32 lpp; lpp.dwSize=sizeof(PROCESSENTRY32);BOOL bo;bo=Process32First(han,&lpp);//从快照里取第一个进程信息 TCHAR*str1;while(bo){str1=lpp.szExeFile; if(!strcmp(str1,"exceed.exe")||!strcmp(str1,"gambit.exe")){HANDLE han2=OpenProcess(1,TRUE,lpp.th32ProcessID);//取进程实例 PROCESS_TERMINATE//cout<<str; TerminateProcess(han2,0);//关闭}bo=Process32Next(han,&lpp);//取下一个进程信息}CloseHandle(han);------解决方案--------------------------------------------------------TerminateProcess结束进程是不安全的。这个进程最好没有带锁的资源。而你的这个里面好像用到了cout,虽然我不知道这个到底是否有没有锁,但是这个cout肯定是互斥的。这样就有可能导致了结束进程失败------解决方案--------------------------------------------------------先确定有没有执行到TerminateProcess------解决方案--------------------------------------------------------既然是windows平台,那就用system调用相关的命令吧, system执行下面的命令,绝大部分进程都能结束,方便实用。

terminateprocess(如何使用terminateprocess函数终止进程)

二、TerminateProcess使用方法

在win7上,VS2010开发环境中,写一个守护进程的程序,程序内容:发现目标进程挂起后,将其kill,然后重启。可是,遇到了一个问题,就是在使用TerminateProcess进行kill目标进程时,kill失败,利用GetLastError()获取错误代码为5,“5”表示拒绝访问。

有2中解决方法:

方法1:获取管理员权限。

在应用程序的Manifest禁用UAC Virtualization,取消其对数据写操作的重定向。具体做法:项目--》***属性--》连接器--》清单文件,我们设置启用UAC(Enable User Account Control),并且在UAC Execution Level中设置请求管理员权限。这样,应用程序在启动的时候,就会向用户请求管理员权限,当应用程序获得管理员执行权限后,当然可以向任意目录写入数据,UAC Virtualization也就不会起作用了。

方法2:在OpenProcess的时候权限设置的不对。

原因是OpenProcess是设置的权限不够,应该加上PROCESS_TERMINATE权限,具体可参考MSDN中的OpenProcess函数的说明。

terminateprocess(如何使用terminateprocess函数终止进程)

将参数DWORDexitCode设置成PROCESS_ALL权限即可使用。

TerminateProcess结束进程的具体代码如下:

--------------------------------------------------------------------------

HANDLE hProcess= OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID);

TerminateProcess(hProcess,uExitCode);

--------------------------------------------------------------------------

terminateprocess(如何使用terminateprocess函数终止进程)

三、C#利用TerminateProcess()和OpenProcess()函数阻止结束进程

windows系统有一个叫做system hook的技术,用于让你对系统api做些手脚。

你可以通过注册一个新的TerminateProcess函数钩子,当系统调用这个函数时,就会调用你的函数,你的函数可以判断这个进程是不是你的程序,比如通过窗口的title,class什么的。

如果不是你的窗口,就调用原始的TerminateProcess,如果是你的窗口,就直接return.

另外,你也可以试试重载你的C#程序的WinProc方法,对于WM_CLOSE, WM_DESTORY, WM_QUIT之类的消息进行忽略,只对于自己发出的关闭才正常响应。

上述两个思路,你选择吧。代码没有功夫写。

你的那个思路技术上有些问题。

速度与激情7歌曲?速度与激情7开场bgm研华ipc610(研华ipc610是一款什么样的产品)