Pb pour Killer un process
Bonjour,
Je suis en train de développer un utilitaire visant à killer une application métier qui serait plantée.
Le souci, est que si cette application est lancée, je ne peux arrêter aucune application quelle qu'elle soit, y/c celle que je suis censé killer.
Si ladite application (dev en c#) n'est pas lancée, alors je peus killer toutes les autres applications sans souci.
Je n'arrive pas à comprendre ce qui bloque mon prog.
Pour info, si je passe par un gestionnaire de tâches, pas de souci, je peux bien supprimer l'appli métier en question ; cependant, l'utilisateur n'a pas accès au gestionnaire des tâches, d'ou mon utlitaire...
Ci joint plus bas mon bout de code.
Le pb se situe au niveau de :
IntPtr intptrSnapshot_ = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
qui me renvoie -1 si l'appli métier est lancée (ce qui me pose pb car il y a bien des tas de process lancés, et donc la valeur devrait être différente de -1), et une autre valeur si elle ne l'est pas.
Pour le code, je n'ai pas la prétention de l'avoir pondu, je remercie celui qui l'a fait pour nous et qui l'a mis à disposition des autres...
Code:
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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
| public static List<ProcEntry> list_ = null;
public class ProcEntry
{
public string ExeName;
public uint ID;
}
public class ProcessEnumeratorOutil
{
#region Constantes
private const uint TH32CS_SNAPPROCESS = 0x00000002;
private const int MAX_PATH = 260;
#endregion
#region Structures
public struct PROCESSENTRY
{
public uint dwSize;
public uint cntUsage;
public uint th32ProcessID;
public uint th32DefaultHeapID;
public uint th32ModuleID;
public uint cntThreads;
public uint th32ParentProcessID;
public int pcPriClassBase;
public uint dwFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
public string szExeFile;
uint th32MemoryBase;
uint th32AccessKey;
}
#endregion
#region P/Invoke
[DllImport("toolhelp.dll")]
private static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processID);
[DllImport("toolhelp.dll")]
private static extern int CloseToolhelp32Snapshot(IntPtr snapshot);
// Cette fonction permet de demander le premier processus provenant de la liste contenu dans une photo du système d'exploitation
[DllImport("toolhelp.dll")]
private static extern int Process32First(IntPtr snapshot, ref PROCESSENTRY processEntry);
// Cette fonction permet de demander le processus suivant provenant de la liste contenu dans une photo du système d'exploitation
[DllImport("toolhelp.dll")]
private static extern int Process32Next(IntPtr snapshot, ref PROCESSENTRY processEntry);
#endregion
#region public Methods
/// <summary>
/// Fonction énumérant la liste des process en cours d'utilisation
/// </summary>
/// <param name="list">Indiquer le type de liste que l'on désire envoyer en paramètre : ici " ProcEntry "</param>
/// <returns></returns>
public static bool Enumerate(ref List<ProcEntry> list)
{
if (list == null)
{
return false;
}
list.Clear();
IntPtr intptrSnapshot_ = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (intptrSnapshot_ == IntPtr.Zero)
{
return false;
}
PROCESSENTRY peEntry_ = new PROCESSENTRY();
peEntry_.dwSize = (uint)Marshal.SizeOf(peEntry_);
if (Process32First(intptrSnapshot_, ref peEntry_) == 0)
{
CloseToolhelp32Snapshot(intptrSnapshot_);
return false;
}
do
{
ProcEntry procEntry = new ProcEntry();
procEntry.ExeName = peEntry_.szExeFile;
procEntry.ID = peEntry_.th32ProcessID;
list.Add(procEntry);
peEntry_.dwSize = (uint)Marshal.SizeOf(peEntry_);
}
while (Process32Next(intptrSnapshot_, ref peEntry_) != 0);
CloseToolhelp32Snapshot(intptrSnapshot_);
return true;
}
#endregion
}
/// <summary>
/// Kill le process indiqué en argument
/// </summary>
public static void CtrlProcess(string ProcessName, string strAppName)
{
// Instanciation de la nouvelle liste
list_ = new List<ProcEntry>();
// on essaie de killer le process s'il existe...
try
{
int intCpt = 0;
if (ProcessEnumeratorOutil.Enumerate(ref list_))
{
for (int i = 0; i < list_.Count; i++)
{
if (list_[i].ExeName.ToLower() == ProcessName.ToLower())
{
Process myProcess = Process.GetProcessById((int)(list_[i].ID));
myProcess.Kill();
// Affichage d'un msgBox de succès
MessageBox.Show(string.Format("L'application {0} est maintenant fermée", strAppName), string.Format("Fermeture de {0}",strAppName), MessageBoxButtons.OK, MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button1);
intCpt = 1;
}
}
}
// ... si le process n'est pas trouvé (l'application n'est pas lancée), on prévient l'utilisateur
if (intCpt == 0)
{
MessageBox.Show(string.Format("L'application {0} n'est pas en cours d'exécution.", strAppName));
}
}
// ...sinon on alerte l'utilisateur qu'un bug est survenu
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} |
Je vous remercie d'avance pour votre aide précieuse,