进程只是提供了一段地址空间和内核对象,其运行时通过在其地址空间内的主线程来体现的。当主线程的进入点函数返回时,进程也就随之结束。这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的清除。除了这种进程的正常退出方式外,有时还需要在程序中通过代码来强制结束本进程或其他进程的运行。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()结束进程相关推荐

  1. 使用ExitProcess()结束本进程、TerminateProcess 结束进程

    进程只是提供了一段地址空间和内核对象,其运行时通过在其地址空间内的主线程来体现的.当主线程的进入点函数返回时,进程也就随之结束.这种进程的终止方式是进程的正常退出,进程中的所有线程资源都能够得到正确的 ...

  2. 使用TerminateProcess结束进程时,错误码为5的解决方法

    最近在win7上,VS2010开发环境中,写一个守护进程的程序,程序内容:发现目标进程挂起后,将其kill,然后重启. 可是,遇到了一个问题,就是在使用TerminateProcess进行kill目标 ...

  3. VC使用TerminateProcess结束进程实例

    本文实例讲述了VC使用TerminateProcess结束进程的方法,分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: int KillProcess(LPCSTR pszClassNa ...

  4. 511遇见易语言模块API教程进程结束和进程取自进程ID

    当我们多线程多窗口启动游戏时,在退出时我们手动比较麻烦,可以使用进程结束一键退出. 511遇见易语言模块API教程 1.GetCurrentProcessId 获取当前进程一个唯一的标识符 说明: 获 ...

  5. mysql killed进程不结束_php和mysql连接方式(短 长 池)

    一个php work进程只能处理一个请求,当完成一个请求了,才能处理下一次的请求 2.短连接: 执行到php关闭mysql连接的代码时,就断开,否则在处理本次请求结束的时候,释放mysql连接 实验: ...

  6. 【Linux系统编程】进程的控制:结束进程、等待进程结束

    结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳出 switch() 语句 ret ...

  7. Delphi写的等待进程运行结束函数

    procedure TForm1.Button1Click(Sender: TObject); var   sCommandLine: string;   bCreateProcess: boolea ...

  8. IDEA 惊天 bug:进程已结束,退出代码 1073741819

    来源 | 沉默王二 责编 | Carol 头图 | CSDN 下载自视觉中国 今天要写的文章中涉及到一串代码,关于 Undertow 的一个入门示例,贴出来大家看一下. public class Un ...

  9. linux 父子进程结束,Linux下让父进程结束后,子进程自动结束

    在多进程编程的时候,经常会遇到这样的情况.父进程创建了一堆子进程,当遇到错误或者操作失误的时候把父进程关闭了,但是子进程还在跑,不得不一个一个地杀死子进程,或者使用ps,grep,awk,kill来配 ...

最新文章

  1. 信息抽取(二)花了一个星期走了无数条弯路终于用TF复现了苏神的《Bert三元关系抽取模型》,我到底悟到了什么?
  2. jmeter java性能_jmeter java性能测试
  3. 写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。
  4. LeetCode 633 平方数之和
  5. ttf文件 python 打开_[译]JS解析TTF字体文件
  6. XML配置文件的智能感知(IntelliSense)功能
  7. ScrollView-图片的放大缩小
  8. 区间dp讲解之石子合并问题 区间dp的分析方法
  9. C#使用AForge连接摄像头并且拍照
  10. iir 滤波器 结构介绍
  11. 如何从mp4视频格式中提取出mp3音频格式
  12. 六个步骤搞定学术论文写作!
  13. 房产管理系统有哪些领先技术的应用?
  14. vue实现密码显示隐藏、很简单易懂
  15. html5拖拽实现拼图,HTML5技术之图像处理:一个滑动的拼图游戏
  16. centos /bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
  17. 前端工程化——脚手架及自动化构建
  18. picpick尺子像素大小精度不够准确_如何使用像素标尺在PicPick
  19. 高中数学40分怎么办_高一数学考40分还能拯救吗
  20. 售前工程师、实施工程师、运维、技术支持这些岗位的具体区别是什么?他们的工作内容大致都是什么?

热门文章

  1. 超全伏特加免抠摄影素材网站整理
  2. C语言题目:5-10 求最大值 (25 分)(求赞呀)
  3. 一张图看懂DNS域名解析全过程
  4. Color android
  5. 吃鸡2019年5月7日服务器维护,绝地求生更新:绝地求生5月7日更新内容 绝地求生5月7日更新维护公告...
  6. 1952年 赫尔辛基 第十五届奥运会
  7. Future模式详解
  8. 鼓励参与计算机考试宣传标语,考试考场宣传标语横幅大全
  9. 当今单身白领的生活状态,宅男or干物女?
  10. 基于Java实现简单亚马逊爬虫