当前位置:C++技术网 > 资讯 > 通过进程的ID关闭进程

通过进程的ID关闭进程

更新时间:2015-06-23 20:46:09浏览次数:1+次

    利用进程ID我们可以在程序中强制关闭对应的进程。
    不过没有API函数可以直接通过ID来关闭进程,需要提供进程的句柄才能关闭。所以我们需要先通过ID获得进程的句柄。
    通过ID获取进程句柄的方法,在之前发表的《使用ID获得进程句柄的方法》文章中详细介绍了,可以使用站内搜索找到。
    有了进程句柄,我们就可以任意操作这个进程了。不过有权限的限制,还有不同系统版本的限制。如果你发现程序执行失败,请仔细查看MSDN的说明。
    通过OpenProcess函数我们获取了进程句柄,下一步我们就使用另外一个函数来强制终止打开的进程。这个函数就是大名鼎鼎的TerminateProcess.除非有特别用途,比如任务管理器之类的,否则自己的程序中尽量不要使用这个函数.因为这个函数是强行终止程序,如果程序中还有任务没有完成,文件没有保存好,强行终止会导致程序来不及保存而被退出导致数据丢失.所以请慎用. 
    不过,这个函数使用起来倒是很方便.两个参数而已.第一个就是进程句柄,第二个就是程序退出码.关键的问题就是进程句柄获取比较麻烦,不过在《使用ID获得进程句柄的方法》中已经描述了。第二个参数是退出码。这个是一个整数类型的,你可以自己设定一个,没什么大影响。除非有程序需要获得程序退出码作为他用。比如有一个程序是监控程序,需要知道被监控的程序的状态,退出时是正常退出还是异常退出,或者根据退出码进行各种判断。有一种应用就是推广软件时,会让程序返回一个退出码,然后通过退出码判断是否达到推广的效果等等。
    TerminateProcess返回值为布尔值,成功则真,失败为假。如果失败,请使用FormatMessage来格式化显示错误消息的描述。具体的使用在《FormatMessage格式化错误消息示例详解》详细讲述,可以通过站内搜索找到。
    到此,通过进程ID来强制关闭进程就实现了。TerminateProcess不仅可以关闭其他进程,也可以关闭自己,给它地球进程的句柄,它都可以关闭地球,甚至是宇宙!威力之大,可想而知。不过要慎用,使用不当,或许地球就来不及移民就爆炸啦。哈哈哈。
    下面给出完整的代码:

DWORD pid = 1234;
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
if(TerminateProcess(hProcess,0))
{
    MessageBox(_T("关闭成功!"));
}
else
{
    LPVOID lpMsgBuf; // 接受内部分配的消息缓存的内存地址
    FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER | //使用内部分配内存
        FORMAT_MESSAGE_FROM_SYSTEM |     //从系统查找错误描述
        FORMAT_MESSAGE_IGNORE_INSERTS,     //忽略含%占位符的消息
        NULL,           //NULL表示从系统获取消息描述来源
        GetLastError(), //获取上次出错的错误码
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 使用默认语言
        (LPTSTR)&lpMsgBuf,                           //存放消息缓存地址
        0,    //如果没有设置FORMAT_MESSAGE_ALLOCATE_BUFFER内部分配缓存,则要指定外部缓存的大小,指定了设为即可
        NULL //格式化到%参数中的消息变量列表
    );
    ::MessageBox( NULL, (LPCTSTR)lpMsgBuf, _T("错误提示"), MB_OK | MB_ICONINFORMATION );
    LocalFree( lpMsgBuf );
}