用Visual C++干干净净地清除进程

读者朋友们可能经常会碰到这样一个问题,想对某些进行操作时,发现这些文件正在被其它程序使用,处于打开状态,而且是被独占打开,这时是没法对文件进行操作的。因此,要想操作这些文件,必须将打开这些文件的进程清除掉。那么如何干净地清除进程呢?其实,在Windows2000操作系统版本中有一个工具程序叫tskill.exe,用它就可以清除掉某个程序的进程,在输入"tskill 程序名"后就可以清除其运行实例。但是如何要在代码里实现tskill的功能该如何做呢?针对这一问题,本实例介绍了在Windows2000下实现的方法。

一、实现方法

在Visual C++编程中,最安全的杀死进程的方法是向运行程序的主窗口发送WM_CLOSE消息,其实现代码如下:

HWND hwnd =this.m_hWnd; // 获得主窗口
PostMessage(hwnd, WM_CLOSE, 0, 0);

发送此消息后,通常应该等待直到进程确实终止,当进程终止时,它发出状态信号,并且 WaitForSingleObject 返回WAIT_OBJECT_0。如果返回别的值,进程要么挂起了,要么仍然在进行处理。在这种情况下,杀死这个进程的唯一方法是用功能更强大的API函数:TerminateProcess()。如果想干得漂亮一点,可以在关闭之前向主窗口发送一个WM_QUERYENDSESSION消息,当用户结束会话(log out)或者调用ExitWindows()函数时,应用程序会收到这个消息,然后准备退出进程,此时一般都会弹出一个确认对话框,告诉用户:"程序要推出了,如果要保存修改的东西,现在是最佳时机,想保存吗?"有三种选择(Yes/No/Cancel)。此外,发送WM_QUERYENDSESSION消息可以拒绝推出进程(按下"Cancel键"),如果是这样,进程将会延续。

如果想要关闭的进程被挂起,使用SendMessageTimeout()函数就非常重要,而不是用SendMessage()函数,其参数SMTO_NOTIMEOUTIFNOTHUNG是一个只有Windows 2000 和Windows XP才有的标志。其意义是"如果线程没有挂起,不要超时",换句话说就是如果线程正在进行正常处理,那么永远等待,以便用户能看到对话框并决定做什么,当用户最终做出决定后,SendMessageTimeout()将带着相应的bOKToKill值返回。

本例为了增强代码的可重用性,将实现细节都封装在一个叫CFindKillProcess的类中,包括查找和杀死进程,详情请参见EnumProc.h和EnumProc.cpp文件。文件中还有另外两个可重用类,一个是CProcessIterator,另一个是CWindowIterator。这在实例《获取进程的主窗口以及创建进程的程序名》中有过详细的叙述。

CfindKillProcess类的成员函数FindProcess()查找某个进程序,如果找到这个进程,它返回此进程的ID,然后将此ID传给CFindKillProcess::KillProcess()函数,KillProcess()函数封装了关闭窗口以及终止逻辑,它利用CmainWindowIterator类对象来枚举进程的主窗口(可能不止一个,见"如何获取某个进程的主窗口以及创建进程的程序名?"),并发送WM_CLOSE到每一个窗口,然后等待进程死亡。它有一个布尔型参数用来指示当应用程序进程不愿意退出时是否执行TerminateProcess()函数。详细细节请参见下载的代码。

二、编程步骤

1、启动Visual C++6.0,生成一个控制台应用程序,将该程序命名为"kp";

2、在程序代码中添加CfindKillProcess、CProcessIterator类的定义;

3、添加代码,编译运行程序。

时间: 2024-10-01 21:30:10

用Visual C++干干净净地清除进程的相关文章

消息传递-Visual C++ 中利用WM_COPYDATA进程通信

问题描述 Visual C++ 中利用WM_COPYDATA进程通信 在MFC进程利用通信时,怎么在利用发送消息的窗口类指针pWnd在接收消息后回复一个响应. 具体想法如下: BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { if (pCopyDataStruct != NULL) { LPCTSTR pszText = (LPCTSTR)(pCopyDataStruct->lpData); DW

IIS附加进程在Visual Studio 2010 中进行调试(高级)

步骤:1(关键就是w3wp.exe这个系统进程找到) 步骤:2(在Visual Studio 2010中附加进程) 步骤:3(选择w3wp.exe进程进行附加) 步骤:4(附加) 步骤:5(ISS运行网站进行调试)  

DB2 Universal Database进程详解

介绍 UNIX和Linux用户经常检查运行在服务器上的进程来进行问题分析,并检查服务器上被消耗的资源.这些信息不仅对解决问题和分析资源的系统管理员有用,而且对于开发高可用性和监视DB2进程以判断什么时候执行某种行为(例如数据库重新启动)或者执行必要的服务器错误恢复(failover)的错误恢复脚本都很重要. 如果使用AIX,必须使用ps -ef命令来检查进程.在Solaris和HP-UX上,ps -ef只为所有的服务器端进程(例如agents.loggers.page cleaners和 pre

Solaris进程管理

1.ps 显示进程号 命令格式:ps -ef 2.kill 清除进程 命令格式: kill -9 pid 3.nohup 非挂起运行

用.NET创建Windows服务

window|创建 我们将研究如何创建一个作为Windows服务的应用程序.内容包含什么是Windows服务如何创建.安装和调试它们.会用到System.ServiceProcess.ServiceBase命名空间的类.  什么是Windows服务 Windows服务应用程序是一种需要长期运行的应用程序它对于服务器环境特别适合.它没有用户界面并且也不会产生任何可视输出.任何用户消息都会被写进Windows事件日志.计算机启动时服务会自动开始运行.它们不要用户一定登录才运行它们能在包括这个系统内的

Windows服务创建及安装

原文:Windows服务创建及安装 我们将研究如何创建一个作为Windows服务的应用程序.内容包含什么是Windows服务,如何创建.安装和调试它们.会用到System.ServiceProcess.ServiceBase命名空间的类.什么是Windows服务? Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合.它没有用户界面,并且也不会产生任何可视输出.任何用户消息都会被写进Windows事件日志.计算机启动时,服务会自动开始运行.它们不要用户一定登录才运行,

TRUNCATE 快速删除表中的所有数据

备注 与 DELETE 语句相比,TRUNCATE TABLE 具有以下优点: 所用的事务日志空间较少. DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一个条目.TRUNCATE TABLE 通过释放用于存储表数据的数据页来删除数据,并且在事务日志中只记录页释放. 使用的锁通常较少. 当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除.TRUNCATE TABLE 始终锁定表和页,而不是锁定各行. 表中将毫无例外地不留下任何页. 执行 DELETE 语句后,表仍会包含

如何“干净地”终止Win32中的应用程序

摘要 在理想环境中,某一进程可能会通过某种形式的进程间通信要求另一进程关闭.不过,如果你对希望其关闭的应用程序没有源代码级控制权,可能就没有办法做这样的选择.尽管没有哪种方法能保证"干净地"关闭 Win32 中的应用程序,但你可以采取一些步骤来确保应用程序使用最佳方法清除资源. 32 位进程(和 Windows 95 下的 16 位进程) 在 Win32 下,操作系统可保证在进程关闭时清除进程所拥有的资源.但是,这并不意味着进程本身将有机会对磁盘执行任何最后的信息刷新或通过远程连接执行

双系统中轻松卸载Windows Vista系统

很多朋友都安装了Windows Vista 5219,包括Aero的主题.半透明的地址栏和3D窗口在内的诸多新功能的确令人爱不释手,但Windows Vista对系统配置的要求实在是太高,如果内存低于1GB的话,运行起来可能会相当吃力. 因此,许多朋友在体验了一番Windows Vista 5219的魅力后,就准备将其从系统请出去,但如果已关闭系统还原功能的话,恐怕就不是那么轻松了.这里,笔者向朋友们介绍将Windows Vista 5219从系统请出去的办法: 第1步,删除相关文件 首先,请进