octobre
2006
Le petit programme consôle qui suit permet de terminer un processus en le désignant par le nom de sa fenêtre.
Il utilise les api 32 suivantes :
FindWindow pour trouver le handle de la fenêtre.
GetWindowThreadProcessId pour trouver l’identifiant du thread principal associé à l’application.
PostThreadMessage pour envoyer un message au thread, ici pour terminer notre application on enverra WM_QUIT.
OpenProcess : permet de récupérer un handle sur le processus grâce à son identifiant obtenu avec GetWindowThreadProcessId
TerminateProcess : permet de terminer « brutalement » le processus.
Principe de fonctionnement :
On cherche la fenêtre avec le nom fourni en argument du programme.
On récupère l’identifiant du thread pour lui signifier sa fermeture par un PostThreadMessage de WM_QUIT.
Si l’application ne possède pas de pompes à message sur le thread principal comme par exemple une boite de commande MS DOS la commande échouera,
On utilisera alors une alternative plus musclée : TerminateProcess.
Avant d’en arriver la, on commence par vérifier si le processus est toujours actif en utilisant l’api GetExitCodeProcess
Si c’est le cas on détruit le processus avec TerminateProcess.
la phase finale de destruction:
SetDebugPrivileges();
// open process
HANDLE hProcess = OpenProcess( PROCESS_TERMINATE |PROCESS_QUERY_INFORMATION , FALSE, dwProcessId);
str.Format(_T("OpenProcess: 0x%xh"),hProcess);
cout <<(LPCSTR) str << endl;
if (IsBadHandle( hProcess ))
{
cout << _T( "OpenProcess() failed, err = ") << GetLastError() << endl;
}
else
{
WaitForSingleObject(hProcess, 5000);
DWORD dwExitCode = 0;
if(!GetExitCodeProcess(hProcess, &dwExitCode))
cout << _T( "GetExitCodeProcess erreur, err = ")<< GetLastError() << endl;
else if(dwExitCode == STILL_ACTIVE) //process toujours présent ?
{
// en dernier recours forcer la fermeture du process avec un code d'erreur à zéro pour l'exemple
if(!TerminateProcess(hProcess,0 ))
cout << _T( "TerminateProcess() erreur, err = ")<< GetLastError() << endl;
else cout << "Ferme par TerminateProcess !" << endl;
}
// close handle
CloseHandle( hProcess );
}
Le lien vers les sources du programme, avec Visual 6.0
D’aprés la Q/R de la Faq VC : Comment détruire un processus ?
Articles récents
Commentaires récents
Archives
- septembre 2010
- mai 2010
- avril 2010
- février 2010
- août 2009
- juin 2009
- mai 2009
- février 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
- décembre 2006
- novembre 2006
- octobre 2006
- septembre 2006
- août 2006
- juillet 2006
- juin 2006
- mai 2006
- mars 2006
- février 2006