使用ExitProcess ()终止进程
进程只提供地址空间和内核对象,在运行时由该地址空间中的主线程表示。 当返回主线程的入口点函数时,该进程也将终止。 此进程的终止方式是进程的成功终止,该进程中的所有线程资源都将正确清除。 除了这种进程的正常终止方法外,还可能需要在程序中使用代码强制终止本进程和其他进程的执行。 ExitProcess ()函数的原型如下:
语音退出处理(uintuexitcode;
那个参数uExitCode在流程中设定了结束代码。 此函数具有强制性,运行完成后流程将终止,以后的代码将无法运行。 ExitProcess ) )函数在退出流程时可以通知相关动态链接库,但由于强制执行这些函数,ExitProcess ) )函数的使用存在安全问题。 例如,如果程序在调用ExitProcess ()函数之前在new操作符中请求空间,则由于ExitProcess () )函数的强制性,delete操作符无法释放,从而导致内存泄漏。 由于ExitProcess () )函数具有强制性和不稳定性,使用时请小心。
使用TerminateProcess ()终止进程
ExitProcess ()只强制终止本进程,而要在一个进程中强制终止另一个进程(TerminateProcess ) )实现。 与ExitProcess ()不同,TerminateProcess () )函数运行后,已终止的进程不会收到程序终止的通知。 也就是说,被结束的进程不能在结束前进行结束前的结束工作。 因此,通常只有在无法以其他方式强制终止进程时,才考虑使用“终止活动进程”)来强制终止进程。 以下是TerminateProcess ()的函数原型:
oolterminateprocess (handle hprocess,UINT uExitCode );
参数hProcess和uExitCode分别是流程句柄和退出代码。 如果结束的是该进程,则可以通过GetCurrentProcess ()获取句柄。 TerminateProcess ()异步运行,并且在调用返回后,无法确定终止的进程是否真的终止。 TerminateProcess ) )调用的进程如果对该详细信息感兴趣,则可以在WaitForSingleObject ) )中等待进程的真正结束。
如何终止系统在VC程序中运行的其他进程(此进程需要窗口界面)可以通过以下步骤轻松完成:
1 .获取进程句柄(通过窗口函数获取);
2 .获取进程ID号(通过GetWindowThreadProcessId函数获取);
3 .通过打开进程并将OpenProcess函数的第一个参数设置为PROCESS_TERMINATE,可以获取处理该进程的句柄。
使用TerminateProcess函数终止该过程,并将函数的第二个参数设置为4。
代码如下。
//结束进程
intcstaticfunc :3360 kill process (lpcstrpszclassname,lpcstr
pszWindowTitle )
{
手持程序手持程序;
ULONG nProcessID;
HWND TheWindow;
the window=:3360 findwindow (null,pszWindowTitle ); getwindowthreadprocessid (the window,nProcessID );
hprocess handle=:3360 open process (process _ termin ate,FALSE,
n处理程序id;
返回:3360终端ate process (hprocess handle,4 );
}
启动过程只需使用CreateProcess函数即可完成。 请注意此函数的一些输入参数。 第一个参数是
//开始新进程
intcstaticfunc :3360创建新流程(lpcstrpszexename ) )。
{
process _ informationpiprocinfogps;
STARTUPINFO siStartupInfo;
SECURITY_ATTRIBUTES saProcess,saThread;
zeromemory(sistartupinfo,sizeof ) sistartupinfo );
si startup info.CB=sizeof (si startup info );
sa process.nlength=sizeof (sa process );
sa process.lpsecuritydescriptor=null;
saProcess.bInheritHandle=true;
sa thread.nlength=sizeof (sa thread );
sa thread.lpsecuritydescriptor=null;
saThread.bInheritHandle=true;
返回:3360创建进程(空,) LPTSTR ) pszExeName,sa进程,
saThread,false,
CREATE_DEFAULT_ERROR_MODE、NULL、NULL,
siStartupInfo,piProcInfoGPS;