ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Lister les processus en cours sur la machine   



L'auteur

Christophe Chenavier
France France
Membre Simple
# 0000000023
enregistré le 14/10/2004
http://www.corwin.fr
58 ans
CHENAVIER Christophe
80440 BOVES
de la société Corwin
Fiche personnelle


Note des membres
19/20
1 vote


Contributions > 05 - API et appels systèmes

Lister les processus en cours sur la machine
# 0000000294
ajouté le 27/02/2006 10:44:37 et modifié le 27/02/2006
consulté 10022 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0

Description
La classe ProcessList permet d'obtenir la liste des processus en cours sur la machine

Exemple :
 
CREATE CURSOR TProc (ID I, Name C(20))
oProcess = CREATEOBJECT("ProcessList")
WITH oProcess
     FOR I = 1 TO .Count
         INSERT INTO TProc (ID, Name) VALUES(.Item(I).nPid, .Item(I).cName)
     ENDFOR
ENDWITH
BROWSE NORMAL NOWAIT
 
Note 1 : la méthode Refresh permet d'actualiser la liste.
Note 2 : il est possible d'obtenir le nom d'un processus à partir de son Pid :

         objet.Item(cPid).cName 

Code source :
*!*    Objet : Liste des processus en cours sur la machine
*!*    Auteur : C.Chenavier
*!*    Version : 1.00 - 10/05/2005

#DEFINE PROCESS_VM_READ            0x10
#DEFINE PROCESS_QUERY_INFORMATION  0x400

DEFINE CLASS ProcessList AS COLLECTION
       HIDDEN BaseClassClassClassLibraryCommentParentParentClassTag

       PROCEDURE Init
           LOCAL nLibs
           LOCAL ARRAY aLibs(1,3)

           M.nLibs = ADLLS(aLibs)
           IF M.nLibs = 0 OR ASCAN(aLibs,"EnumProcesses",1,0,1,7)=0
              DECLARE INTEGER EnumProcesses IN psapi;
                      STRING  @ lpidProcess,;
                      INTEGER   cb,;
                      INTEGER @ cbNeeded

              DECLARE INTEGER OpenProcess IN kernel32;
                      INTEGER dwDesiredAccessas,;
                      INTEGER bInheritHandle,;
                      INTEGER dwProcId

              DECLARE INTEGER GetModuleBaseName IN psapi;
                      INTEGER  hProcess,;
                      INTEGER  hModule,;
                      STRING @ lpBaseName,;
                      INTEGER  nSize
           ENDIF
           IF M.nLibs = 0 OR ASCAN(aLibs,"CloseHandle",1,0,1,7)=0
              DECLARE INTEGER CloseHandle IN kernel32;
                      INTEGER hObject
           ENDIF
           THIS.Refresh
       ENDPROC


       PROCEDURE Refresh
           LOCAL I, nLibs, cPidList, nSize, oProcess

           FOR I = 1 TO THIS.Count
               THIS.Remove(1)
           ENDFOR

           M.cPidList = SPACE(65535)
           M.nSize = 0
           IF EnumProcesses(@cPidList, 65536, @nSize) > 0
              M.cPidList = LEFT(M.cPidList, M.nSize)
              FOR I = 1 TO INT(M.nSize/4)
                  oProcess = CREATEOBJECT("Process")
                  oProcess.nPid = INT(Str2Long(SUBSTR(M.cPidList, (I)*4+1, 4)))
                  oProcess.cName = LOWER(THIS.GetName(oProcess.nPid))
                  THIS.Add(oProcess, TRANSFORM(oProcess.nPid))
              ENDFOR
           ENDIF
       ENDPROC


       FUNCTION GetName
           LPARAMETERS nPid

           LOCAL nHandle, cName

           IF M.nPid > 0
              M.nHandle = OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, .F., M.nPid)
              M.cName = SPACE(80)
              IF GetModuleBaseName(M.nHandle, 0, @cName, LEN(M.cName)) = 0
                 M.cName = "System"
              ELSE
                 M.cName = STRTRAN(ALLTRIM(M.cName), CHR(0))
              ENDIF
              CloseHandle(M.nHandle)
           ELSE
              M.cName = "Processus inactif"
           ENDIF

           RETURN M.cName
       ENDFUNC

ENDDEFINE


DEFINE CLASS Process AS CUSTOM

       nPid = 0
       cName = ''

ENDDEFINE



*---------------------------------------------------------------- Str2Long

FUNCTION Str2Long

LPARAMETERS cLongStr

LOCAL I, nRetVal

M.nRetVal = 0
FOR I = 0 TO 24 STEP 8
    M.nRetVal = M.nRetVal + (ASC(M.cLongStr) * (2^I))
    M.cLongStr = RIGHT(M.cLongStr, LEN(M.cLongStr) - 1)
ENDFOR

RETURN M.nRetVal

Commentaires
le 27/02/2006, Jean à Grenoble a écrit :
je ne crois pas que la classe de base 'COLLECTION' existe en VFP6 !

Jean à Grenoble

le 27/02/2006, François 37 a écrit :
Dans versions FoxPro, c'est marqué pour VFP 7 8 & 9 ...
tant qu'à "abandonner" FoxPro Dos
tu aurais pu prendre la dernière version ;o))


Publicité

Les pubs en cours :


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3