Liste processus

Résolu
T103 Messages postés 177 Date d'inscription lundi 11 août 2003 Statut Membre Dernière intervention 21 avril 2010 - 5 févr. 2007 à 19:05
T103 Messages postés 177 Date d'inscription lundi 11 août 2003 Statut Membre Dernière intervention 21 avril 2010 - 5 févr. 2007 à 22:35
Bonsoir a tous,

Voila j'essaye de faire un programme qui m'affiche tous mes processus actif.
Voici le code donc :

[DllImport("KERNEL32.DLL",SetLastError=true)]
        public static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processid);

        [DllImport("kernel32.dll", SetLastError=true)]
         static extern bool Process32First(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);

        [DllImport("kernel32.dll", SetLastError=true)]
        static extern bool Process32Next(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);

        [DllImport("kernel32.dll", SetLastError=true)]
        static extern bool CloseHandle(IntPtr hObject);

        [StructLayout(LayoutKind.Sequential)]
        internal struct PROCESSENTRY32
        {
            public uint dwSize;
            public uint cntUsage;
            public uint th32ProcessID;
            public IntPtr th32DefaultHeapID;
            public uint th32ModuleID;
            public uint cntThreads;
            public uint th32ParentProcessID;
            public int pcPriClassBase;
            public uint dwFlags;
            public string szExeFile;
        };

            const int TH32CS_SNAPPROCESS = 2;
            const int SIZEOF_PROCESSENTRY32 = 564;
            const int SIZE_OFFSET = 0;
            const int PROCESS_OFFSET = 8;
            const int PARENT_OFFSET = 24;

        private void Form1_Load(object sender, EventArgs e)
        {
            IntPtr hdl;
            PROCESSENTRY32 p = new PROCESSENTRY32();

            p.dwSize = (uint)Marshal.SizeOf(typeof(PROCESSENTRY32));
            hdl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
            bool rv = Process32First(hdl, ref p);

            while (rv)
            {
                uint pid = p.th32ProcessID;
                uint parent = p.th32ParentProcessID;
                richTextBox1.Text = p.szExeFile + " " + p.th32ProcessID.ToString() + "\r\n";
                rv = Process32Next(hdl, ref p);
            }
            CloseHandle(hdl);
        }

Le problème c'est que ma variable booléenne rv est toujours a FALSE. Et je ne comprend pas pouquoi sachant que j'ai des processus qui tournent.

Merci pour vos aides

Cordialement Exile

8 réponses

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
5 févr. 2007 à 22:21
Ah ok, je viens de regarder la structure PROCESSENTRY32 sur msdn. le membre szExeFile est de taille fixe (MAX_PATH).

Au lieu de:
public string szExeFile;

essais ceci (rajoute la constante MAX_PATH = 260)
[
MarshalAs(
UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]

public
string szExeFile;

++
3
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
5 févr. 2007 à 19:54
Bonsoir,
Pourquoi ne pas utiliser System.Diagnostics.Process ?

++
0
T103 Messages postés 177 Date d'inscription lundi 11 août 2003 Statut Membre Dernière intervention 21 avril 2010
5 févr. 2007 à 21:04
oui je pourrais l'utiliser, mais je voudrais savoir pourquoi j'ai toujours ma variable a false ??
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
5 févr. 2007 à 21:23
Regarde le code erreur avec Marshal.GetLastWin32Error. Puis recherche sur MSDN à quoi il correspond.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
T103 Messages postés 177 Date d'inscription lundi 11 août 2003 Statut Membre Dernière intervention 21 avril 2010
5 févr. 2007 à 21:38
J'ai fait ce que tu ma dit, j'ai trouvé le numéro 1008 en code erreur ce qui correspond a sa :

ERROR_NO_TOKEN
1008 An attempt was made to reference a token that does not exist.

Euh je comprend pas trop
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
5 févr. 2007 à 21:56
Quelle est la valeur du pointeur (rv) retourné par CreateToolhelp32Snapshot ? Une fois Process32First appelé juste après que contient ta structure p ?
0
T103 Messages postés 177 Date d'inscription lundi 11 août 2003 Statut Membre Dernière intervention 21 avril 2010
5 févr. 2007 à 22:08
hdl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

hdl me renvoie 1036

bool rv = Process32First(hdl, ref p);

et ensuite rv me renvoie false, ensuite voici le contenu de ma stucture apre l'appel de Process32First :

dwSize = 40
cntUsage = 0
th32ProcessID = 0
th32DefaultHeapID = 0
th32ModuleID = 0
cntThreads = 0
th32ParentProcessID = 0
pcPriClassBase = 0
 dwFlags = 0
 szExeFile = NULL
0
T103 Messages postés 177 Date d'inscription lundi 11 août 2003 Statut Membre Dernière intervention 21 avril 2010
5 févr. 2007 à 22:35
Excellent sa marche !! Merci beaucoup pour ton aide, je te remercie infiniment :) Passe une bonne soirée et merci encore ;)
0
Rejoignez-nous