Question : How kill  a process launching with a .bat file by ShellExecuteex ?

Hi,

Trying to use SHELLEXECUTEINFO struct and ShellExecuteEx function to launch a process, I want to kill  it after when some conditions is ok. This process pings an ip address and I want to quit this process ( .bat file) when the ping response is ok.

My problem is that I can't terminate this started process. Could you give me a way to terminate, kill this process. ( See my code below)

Thank you
Code Snippet:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
//globales variables
		FILE* temp=NULL;
		FILE* fichierping = NULL;
 
		SHELLEXECUTEINFO sei5;  //091001
		DWORD dw;   //091001
	
	
	
	.....
		
	else if(process_4==true)
	{		
			int err;
			fichierping = fopen("pingto.bat", "w");
 
			CString echopt ="@ECHO OFF";
			CString ping ="ping";
			CString redirect =" -t >temp";//" -n 1 > temp";
 
			fflush(stdout);
			fflush(stdin);	
			fprintf(fichierping, "%s\n%s\t%s\t%s\n",echopt,ping,str_ip1/*,opt*/,redirect); 	//str_ip1 contains the ip string
			fclose(fichierping);
		
		memset(&sei5,0,sizeof(SHELLEXECUTEINFO));  
  		sei5.cbSize = sizeof(SHELLEXECUTEINFO);  
  		sei5.fMask = err ? 0 : SEE_MASK_FLAG_NO_UI;  
  		sei5.lpVerb = "open"; 
		sei5.lpFile = "pingto.bat"; 
  		sei5.nShow = SW_SHOW;  
		
		if(ShellExecuteEx(&sei5) == FALSE)  
 		{  
			//there was an error  
 			MessageBox("Error starting program");  
  		}  
		else
		{
			process_5 = true;
			process_4 = false;
			//remove("pingto.bat");
		}
		RedrawWindow(); 
	}
 
	//////////////
	else if(process_5==true)
	{
	
		int result =0;
			
		{
			//temp = fopen ("temp","w"); //bug
			temp = fopen ("temp","r");
			char test[50];
			while (!feof (temp))
			{
				  fscanf (temp,"%s",test);
				  if (strcmp (test,"TTL=128") == 0)
				  {
					   result = 1;
				  }
			}
			fclose(temp);
		}
	
	
		if(result==1) 
		{
			KillTimer(3);  //Timer to loop in processes
			process_5=false;
			//remove("temp"); //091002 n'eface pas car process ping tjs en cours d'abord killer le shellexecuteEx()
 
			//free (temp);
			remove("pingto.bat");
			remove("stdin_ok.txt");
			remove("sencmd.bat");
 
			good_finish =true;
 
 
				
				GetExitCodeProcess(sei5.hProcess,&dw);  
				Sleep(2000);
				TerminateProcess(sei5.hProcess,dw); 
 
				if (!(dw==0))
				{ MessageBox("No terminate try other thing");
					//ExitProcess(dw);
					//WaitForSingleObject(sei5.hProcess, 1500);
					//PostThreadMessage(sei5.hProcess, WM_CLOSE, 0, 0);
					//sei5.hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dw );
					//TerminateProcess(sei5.hProcess, 0);
					//CloseHandle(sei5.hProcess);	
						
				}
		
				remove("temp");  // no possible to delete temp if process is not kill.
 
		}
	
	}
	
	....

Answer : How kill  a process launching with a .bat file by ShellExecuteex ?

Yes, that would certainly solve the problem, but the other alternative -- to
     not use -t
-- would also work.

The reason that the program cannot kill the process started by ShellExecute is that the process handle returned is that of Cmd.Exe -- not Ping.Exe.  Killing Cmd.Exe will not kill Ping.Exe.

That's no big deal... just use CreateProcess or ShellExecute passing Ping.Exe as the program.  But alas,  Develprog thinks he needs to use redirected I/O and that to make that happen, he thinks he must use
    >temp
in the command line.  Alas, that only works when using Cmd.Exe as the program.

So there are two simple solutions:

1) Don't use Ping -t
   Instead run the Ping command (without -t) again and again.  The result would be as desired.

2) Do use Ping -t, but handle the redirection via the technique described here.  

3) Don't use Ping.Exe at all.  Instead write program code that does the same thing.  I'm afraid that this technique would complicate the program beyond the apparent programming expertice level of the asker.

4) There is an alternative that nobody has suggested yet...  I'd never suggest this except that the good solutions have already been rejected:

To kill the ping -t command execute this:  

1:
  system( "taskkill /IM ping.exe /F" ); 
Random Solutions  
 
programming4us programming4us