进程的创建
STARTUPINFO si; //**成员DWORD dwFlags;表示结构体当中哪些成员有效。**STARTF_USESHOWWINDOW|STARTF_USEPOSITION PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); //LPTSTR pszCmdLine = TEXT("C:\\Windows\\System32\\notedap.exe");改成 //TCHAR pszCmdLine[] = TEXT("C:\\Windows\\System32\\notedap.exe"); //Windows核心编程专门有讲这个问题 CreateProcess会修改传递给它的命令行字符串, LPTSTR是字符串指针不能修改....* / //char* szCommandLine ="C:\\Program Files (x86)\\KuGou\\KGMusic\\KuGou.exe"; TCHAR szCommandLine[] = TEXT("notepad ReadMe.txt");//父进程当前目录下的ReadMe.txt ::CreateProcess(NULL,//可执行文件名(必须添加.exe。若未添加路径则只会去当前目录找。so一般为NULL) (LPWSTR)szCommandLine,//传递给执行模块的参数,相当于在运行栏输入szCommandLine(可以在一些目录下自动搜寻exe) NULL,//进程安全性 NULL, //线程安全性 FALSE,//当前进程的可继承句柄是否可以被新进程继承 NULL,//创建标志 如 CREAT_NEW_CONSOLE NULL, //环境变量 NULL,//当前目录 &si,//父给子进程的显示信息 &pi);//此进程的标志信息 ID\句柄 &pi.dwProcessId;//进程ID &pi.dwThreadId;//进程中主线程ID &pi.hProcess;//进程内核句柄 &pi.hThread;//进程中主线程内核句柄
终止进程
//::ExitProcess(0); //终止当前进程,退出代码0 //BOOL bBet=::TerminateProcess(pi.hProcess,-1);//退出代码-1(关闭进程失败) HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, //想得到的访问权限 FALSE, //返回的句柄是否可以被继承 pi.dwProcessId);//进程ID BOOL bBet = ::TerminateProcess(hProcess, -1);//(关闭进程成功) CloseHandle(hProcess); CloseHandle(pi.hProcess); //不使用就关闭
创建线程
DWORD dwThreadId; HANDLE hHandle; hHandle = ::CreateThread(NULL, //线程安全属性 NULL, //线程堆栈大小 ThreadFun, //线程函数起始地址 NULL, //传给线程函数的参数 0, //是否立即启动线程 &dwThreadId);//取得线程ID //一般使用下面方法 UINT uId; HANDLE hHandleCopy; hHandleCopy = (HANDLE)::_beginthreadex(NULL, //线程安全属性 NULL, //线程堆栈大小 ThreadProc, //线程函数起始地址 NULL, //传给线程函数的参数 0, //是否立即启动线程 &uId);//取得线程ID
线程函数如下:
//============================================================================================ //线程函数的定义 //DWORD WINAPI ThreadFun() //参数LPVOID IpParam是必须的 DWORD WINAPI ThreadFun(LPVOID IpParam) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); TCHAR szCommandLine[] = TEXT("C:\\Program Files (x86)\\KuGou\\KGMusic\\KuGou.exe"); ::CreateProcess(NULL,(LPWSTR)szCommandLine,NULL,NULL,FALSE,NULL,NULL, NULL,&si,&pi); return 0; } //============================================================================================= UINT _stdcall ThreadProc(LPVOID IpParam) { ::WaitForSingleObject(g_hEvent,INFINITE); STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); TCHAR szCommandLine[] = TEXT("notepad ReadMe.txt"); ::CreateProcess(NULL, (LPWSTR)szCommandLine, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi); return 0; } //================================================================================================
线程通信交互
//线程之间的交互(事件内核对象) //HANDLE g_hEvent; g_hEvent = ::CreateEvent(NULL, //事件对象安全属性 FALSE, //是否是手动重置事件对象为未受信(否则系统自动重置) FALSE, //初始状态(受信/未受信)执行中:未受信 NULL); //事件对象名称(可用于OpenEvent()函数的第三个参数,类似进程) ::WaitForSingleObject(hHandle, //对象句柄 INFINITE); //等待时间(\毫秒) Sleep(10000); SetEvent(g_hEvent); //RetEvent(g_hEvent); //自动模式下无需重置(自动重置) ::WaitForSingleObject(hHandleCopy,INFINITE); //等待 //::WaitForMultipleObjects(2, //对象句柄数量 // h, //对象句柄数组 // TRUE, //是否等待所有内核对象变为受信状态(否则有一个就可以) // INFINITE) //等待时间(\毫秒) //很实用,等待指定线程执行完毕(不加这句线程还未执行完毕主线程就已经结束了)
其中SetEvent(g_hEvent);中的g_hEvent是全局变量HANDLE g_hEvent;
SetEvent(g_hEvent)使得事件对象g_hEvent变为受信状态,
此时ThreadProc函数中的::WaitForSingleObject(g_hEvent,INFINITE);函数检测到其为受信时开始执行接下来的代码。
终止线程与终止进程类似,一般不使用终止进程和线程函数,一般使用通信机制告诉要关闭的进程或线程让其自行退出。
强行终止会使得来不及执行析构函数,回收内存,造成内存泄漏。
原文地址:https://www.cnblogs.com/cteng-common/p/progressandthread.html
时间: 2024-10-09 02:12:55