=================================版权声明=================================
版权声明:本文为博主原创文章 未经许可不得转载
请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我
未经作者授权勿用于学术性引用。
未经作者授权勿用于商业出版、商业印刷、商业引用以及其他商业用途。
本文不定期修正完善,为保证内容正确,建议移步原文处阅读。 <--------总有一天我要自己做一个模板干掉这只土豆
本文链接:http://www.cnblogs.com/wlsandwho/p/4694057.html
耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html
=======================================================================
软件做的时候,由于XX原因,我将涉及串口的部分划分成了一个小的exe工程,接收数据后在TCP里发给主程序。
所以就要:
主进程调用子程序生成若干子进程实例。
当主进程关闭时,所有的子进程同时关闭。
=======================================================================
本来想找找Windows核心编程,记得有一些枚举进程的方法,但是好复杂好麻烦,要求的权限也高,天知道会不会被第三方软件拦截
所以找了找MSDN,发现还真有篇技术文档讲了如何关闭子进程:https://msdn.microsoft.com/en-us/library/ms686722%28v=vs.85%29.aspx
官方的可信度高,就是示例代码太恶心了,所以自己写一个简单的代码吧。
=======================================================================
以下代码已消毒,不保证正常正确运行。
=======================================================================
主程序:
头文件
1 #define BSM_EXIT_WLSTEST TEXT("Exit all WLS-Test Instances")
实现代码
1 WPARAM wParam=0; 2 LPARAM lParam=0; 3 DWORD dwRecipients= BSM_APPLICATIONS; 4 UINT uMessage=RegisterWindowMessage(BSM_EXIT_WLSTEST); 5 if (uMessage==0) 6 { 7 MessageBox(TEXT("无法从主程序中结束所有的 WLS-Test 实例程序,请手动关闭。"),TEXT("警告"),MB_ICONWARNING); 8 } 9 else 10 { 11 BroadcastSystemMessage(BSF_IGNORECURRENTTASK, 12 &dwRecipients, 13 uMessage, 14 wParam, 15 lParam); 16 }
=======================================================================
子程序:
头文件
1 #define BSM_EXIT_WLSTEST TEXT("Exit all WLS-Test Instances") 2 3 4 afx_msg LRESULT OnBSMExitWLSTest( WPARAM wParam, LPARAM lParam);
实现文件
1 guMessage=RegisterWindowMessage(BSM_EXIT_WLSTEST); 2 if (guMessage==0) 3 { 4 //no op 5 }
1 BEGIN_MESSAGE_MAP(CWLSTestDlg, CDialogEx) 2 ON_REGISTERED_MESSAGE(guMessage,&CWLSTestDlg::OnBSMExitWLSTest) 3 END_MESSAGE_MAP()
1 LRESULT CWLSTestDlg::OnBSMExitWLSTest(WPARAM wParam,LPARAM lParam) 2 { 3 if (wParam==0 && lParam==0) 4 { 5 OnExit(); 6 } 7 8 return 0; 9 }
=======================================================================
基本上主进程关闭的时候,子进程也很好的关闭了。
=======================================================================
当子程序是自己写的时候,这样能减少很多工作量。
如果子程序不是自己写的,还是枚举进程关闭的好。
当然还有其他方法(job、窗口查找等) 此处不讨论
=======================================================================
看到好书就要买买买,没有为什么。
=======================================================================
20151102 不知为何代码不能用了,在调试环境里BroadcastSystemMessage函数阻塞掉了。可在我干净的虚拟机里还是能跑。
不理解为什么,只能替换成枚举进程的API方法了,此方法过于暴力,不是很好。
代码如下
1 void KillExe(CString strExeName) 2 { 3 if (strExeName == TEXT("")) 4 return ; 5 int nLenExeName = strExeName.GetLength(); 6 if (nLenExeName == 0) 7 return ; 8 9 PROCESSENTRY32 stProcessEntry32; 10 HANDLE hExeHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 11 if (hExeHandle!=INVALID_HANDLE_VALUE) 12 { 13 stProcessEntry32.dwSize = sizeof(PROCESSENTRY32); 14 if (Process32First(hExeHandle, &stProcessEntry32)) 15 { 16 do 17 { 18 if (lstrcmpi(strExeName, stProcessEntry32.szExeFile + lstrlen(stProcessEntry32.szExeFile) - nLenExeName) == 0) 19 { 20 HANDLE hProcessHandle; 21 hProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, true, stProcessEntry32.th32ProcessID); 22 if (hProcessHandle != NULL) 23 { 24 if (TerminateProcess(hProcessHandle, 0) != NULL) 25 { 26 CloseHandle(hProcessHandle); 27 } 28 } 29 30 //return; 31 } 32 }while (Process32Next(hExeHandle, &stProcessEntry32)); 33 } 34 CloseHandle(hExeHandle); 35 } 36 }
使用时
1 KillExe(TEXT("Test.exe"));
强制关掉所有Test.exe进程。
=======================================================================
不知为何今天不开心。