问题解决——关闭子进程

=================================版权声明=================================

版权声明:本文为博主原创文章 未经许可不得转载 

请通过右侧公告中的“联系邮箱(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进程。

 

=======================================================================

不知为何今天不开心。

原文地址:https://www.cnblogs.com/wlsandwho/p/4694057.html