#include <iostream>
#include <windows.h>
#include <tchar.h>
using namespace std;
DWORD WINAPI ThreadProc(LPVOID);
int main()
{
//结束一个进程-进程结束的方式:
/*
* 1.进程的主线程返回(最好的方式)
* 主线程就是Main,WinMain代表的线程,也是进程中的第一个线程
* 主线程返回,进程结束,其他线程自然被系统终止
*
* 2.进程中的一个线程调用ExitProcess函数(不推荐)
* 这个函数只能结束本进程,其他进程无法终止
* 这是一个同步函数,或者是阻塞函数,
*
* 3.结束其他进程中的某个线程调用TerminateProcess函数(不推荐)
* 只要你有足够的权限,你就可以用这个函数结束系统中的任意进程,但这个函数是一个异步函数
* 什么是异步函数?非阻塞函数。
*
* 4.进程中的所有线程执行完毕(这个很少出现)
*/
//结束一个进程都做哪些工作?
/*
* 1.所有线程结束
*
* 2.所有用户GDI对象被释放,所有内核对象被关闭,例如画笔,背景刷,句柄,设备句柄,内存等。
*
* 3.退出码被设置
* BOOL GetExitCodeProcess(HANDLE hProcess,PDWORD* pdwExitCode);
* 如果这个进程依然在运行,那么这个函数返回STILL_ACTIVE
*
* 4.进程内核对象的状态变为有信号状态
* WaitForSingleObject(HANDLE, DWORD)
*
* 5.进程内核对象的计数减一
*
* 6.如果在进程中,直接调用ExitProcess或者TerminateProcess函数,那么c++类的销毁函数可能不会被调用,
* 可能会发生进程的内存泄漏
*/
//父进程与子进程的关系
/*
* 父进程创建完子进程之后,立即关闭子进程的进程句柄
* CloseHandle(ChildProcess_Handle);
* CloseHandle(ChildThread_Handle);
* 就可以断绝父子关系
*/
//创建一个线程,需要使用线程函数
DWORD dwThreadID = 0;
HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, &dwThreadID);
_tprintf(L"the sleeping Thread is %d\n",dwThreadID);
WaitForSingleObject(hThread, INFINITE);
//结束其他进程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 5604);//结束进程PID为 11440 的进程
TerminateProcess(hProcess, 333);//333是退出值,注意这个函数是一个异步函数,可能得到不这个值,要做好同步
//做好同步的手段就是等待这个函数先做完,再继续
WaitForSingleObject(hProcess, INFINITE);//无限等待,直到进程结束
DWORD dwExitCode;
GetExitCodeProcess(hProcess,&dwExitCode);//dwExitCode = 333
cout << "dwExitCode:" << dwExitCode << endl;
return 0;
}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
cout << "Thread start" << endl;
Sleep(2000);//INFINITE无限
cout << "Sleep over" << endl;
//ExitProcess(0);//结束当前进程
//cout << "ExitProcess" << endl;
return 0;
}
Windows编程-怎样安全结束一个进程?结束一个进程要做哪些工作?
最新推荐文章于 2023-06-12 23:20:05 发布