使用ExitProcess()结束本进程,TerminateProcess()结束进程
进程只是提供了一段地址空间和内核对象,其运行时通过在其地址空间内的主线程来体现的。当主线程的进入点函数返回时,进程也就随之结束。这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的清除。除了这种进程的正常退出方式外,有时还需要在程序中通过代码来强制结束本进程或其他进程的运行。ExitProcess()函数的原型为:
void ExitProcess(UINT uExitCode);
其参数uExitCode为进程设置了退出代码。该函数具有强制性,在执行完毕后进程即被结束,因此位于其后的任何代码将不能被执行。虽然ExitProcess()函数可以在结束进程的同时通知与其关联的动态链接库,但是由于它的这种执行的强制性,使得ExitProcess()函数在使用上将存在有安全隐患。例如,如果在程序调用ExitProcess()函数之前曾用new操作符申请过一段空间,那么将会由于ExitProcess()函数的强制性而无法通过delete操作符将其释放,从而造成内存泄露。有鉴于ExitProcess()函数的强制性和不安全性,在使用时一定要引起注意。
2.使用TerminateProcess()结束进程
ExitProcess()只能强制执行本进程的退出,如果要在一个进程中强制结束其他进程就要用TerminateProcess()来实现。与ExitProcess()不同,TerminateProcess()函数执行后,被终止的进程是不会的到任何关于程序退出的通知的。也就是说,被终止的进程是无法在结束运行前进行退出前的收尾工作的。所以,通常只有在其他任何方法都无法迫使进程退出时才会考虑使用TerminateProcess()去强制结束进程。下面给出TerminateProcess()的函数原型:
BOOL TerminateProcess(HANDLE hProcess,UINT uExitCode);
参数hProcess和uExitCode分别为进程句柄和退出代码。如果被结束的是本进程,可以通过GetCurrentProcess()获取到句柄。TerminateProcess()是异步执行的,在调用返回后并不能确定被终止进程是否已经真的退出,如果调用TerminateProcess()的进程对此细节关心,可以通过WaitForSingleObject()来等待进程的真正结束。
在VC程序中如何结束系统正在运行的其他进程(该进程必须有窗口界面),其实很简单,按如下步骤进行即可:
1.取得进程的句柄(利用FindWindow函数得到);
2.获取进程ID号(用GetWindowThreadProcessId函数获取);
3.打开进程,OpenProcess函数中的第一个参数设为PROCESS_TERMINATE,就可以获取处理该进程的句柄;
4.利用TerminateProcess函数结束进程,将该函数的第二个参数设为4。
代码如下:
//结束进程
int CStaticFunc::KillProcess(LPCSTR pszClassName, LPCSTR
pszWindowTitle)
{
HANDLE hProcessHandle;
ULONG nProcessID;
HWND TheWindow;
TheWindow = ::FindWindow( NULL, pszWindowTitle );
::GetWindowThreadProcessId( TheWindow, &nProcessID );
hProcessHandle = ::OpenProcess( PROCESS_TERMINATE, FALSE,
nProcessID );
return ::TerminateProcess( hProcessHandle, 4 );
}
而启动进程则只需要CreateProcess函数就可完成,需要注意的是这个函数的几个输入参数,第一个参数是
//启动新进程
int CStaticFunc::CreateNewProcess(LPCSTR pszExeName)
{
PROCESS_INFORMATION piProcInfoGPS;
STARTUPINFO siStartupInfo;
SECURITY_ATTRIBUTES saProcess, saThread;
ZeroMemory( &siStartupInfo, sizeof(siStartupInfo) );
siStartupInfo.cb = sizeof(siStartupInfo);
saProcess.nLength = sizeof(saProcess);
saProcess.lpSecurityDescriptor = NULL;
saProcess.bInheritHandle = true;
saThread.nLength = sizeof(saThread);
saThread.lpSecurityDescriptor = NULL;
saThread.bInheritHandle = true;
return ::CreateProcess( NULL, (LPTSTR)pszExeName, &saProcess,
&saThread, false,
Create_DEFAULT_ERROR_MODE, NULL, NULL,
&siStartupInfo, &piProcInfoGPS );
}
使用ExitProcess()结束本进程,TerminateProcess()结束进程相关推荐
- 使用ExitProcess()结束本进程、TerminateProcess 结束进程
进程只是提供了一段地址空间和内核对象,其运行时通过在其地址空间内的主线程来体现的.当主线程的进入点函数返回时,进程也就随之结束.这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的 ...
- 使用TerminateProcess结束进程时,错误码为5的解决方法
最近在win7上,VS2010开发环境中,写一个守护进程的程序,程序内容:发现目标进程挂起后,将其kill,然后重启. 可是,遇到了一个问题,就是在使用TerminateProcess进行kill目标 ...
- VC使用TerminateProcess结束进程实例
本文实例讲述了VC使用TerminateProcess结束进程的方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: int KillProcess(LPCSTR pszClassNa ...
- 511遇见易语言模块API教程进程结束和进程取自进程ID
当我们多线程多窗口启动游戏时,在退出时我们手动比较麻烦,可以使用进程结束一键退出. 511遇见易语言模块API教程 1.GetCurrentProcessId 获取当前进程一个唯一的标识符 说明: 获 ...
- mysql killed进程不结束_php和mysql连接方式(短 长 池)
一个php work进程只能处理一个请求,当完成一个请求了,才能处理下一次的请求 2.短连接: 执行到php关闭mysql连接的代码时,就断开,否则在处理本次请求结束的时候,释放mysql连接 实验: ...
- 【Linux系统编程】进程的控制:结束进程、等待进程结束
结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳出 switch() 语句 ret ...
- Delphi写的等待进程运行结束函数
procedure TForm1.Button1Click(Sender: TObject); var sCommandLine: string; bCreateProcess: boolea ...
- IDEA 惊天 bug:进程已结束,退出代码 1073741819
来源 | 沉默王二 责编 | Carol 头图 | CSDN 下载自视觉中国 今天要写的文章中涉及到一串代码,关于 Undertow 的一个入门示例,贴出来大家看一下. public class Un ...
- linux 父子进程结束,Linux下让父进程结束后,子进程自动结束
在多进程编程的时候,经常会遇到这样的情况.父进程创建了一堆子进程,当遇到错误或者操作失误的时候把父进程关闭了,但是子进程还在跑,不得不一个一个地杀死子进程,或者使用ps,grep,awk,kill来配 ...
最新文章
- 信息抽取(二)花了一个星期走了无数条弯路终于用TF复现了苏神的《Bert三元关系抽取模型》,我到底悟到了什么?
- jmeter java性能_jmeter java性能测试
- 写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。
- LeetCode 633 平方数之和
- ttf文件 python 打开_[译]JS解析TTF字体文件
- XML配置文件的智能感知(IntelliSense)功能
- ScrollView-图片的放大缩小
- 区间dp讲解之石子合并问题 区间dp的分析方法
- C#使用AForge连接摄像头并且拍照
- iir 滤波器 结构介绍
- 如何从mp4视频格式中提取出mp3音频格式
- 六个步骤搞定学术论文写作!
- 房产管理系统有哪些领先技术的应用?
- vue实现密码显示隐藏、很简单易懂
- html5拖拽实现拼图,HTML5技术之图像处理:一个滑动的拼图游戏
- centos /bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
- 前端工程化——脚手架及自动化构建
- picpick尺子像素大小精度不够准确_如何使用像素标尺在PicPick
- 高中数学40分怎么办_高一数学考40分还能拯救吗
- 售前工程师、实施工程师、运维、技术支持这些岗位的具体区别是什么?他们的工作内容大致都是什么?