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

Forum AtoutFox : OpenProcess et shellexecute sous VFP   

Sujet

rss Flux RSS des derniers messages

Vous devez vous identifier pour pouvoir poser une question ou répondre.

lun. 28 juillet 2014, 10h42

GLS
France France

atoutfox.public.association

OpenProcess et shellexecute sous VFP

Bonjour,

avec l'exemple d'énumération des processus fourni par Christophe Chenavier j'ai voulu vérifier l’existence d'un exécutable lancé par un shellexecute sous VFP.
Le problème c'est que cet exécutable lancé par VFP n'est pas visible dans les processus, alors que le même exécutable lancé en dehors de VFP est visible dans la liste des processus.

Comment peut avec OpenProcess récupéré le handle de la fenêtre afin de pouvoir d'attendre dans VFP la fin de l'application avant de continuer l'exécution du prg.

je souhaite faire une fonction qui permettrai à VFP d'attendre la fin de l'exécution d'un programme extérieur qu'il aura préalablement (VFP) lancé avec un ShellExecute()..

Le code VFP de test:
* Test de récupération ID et nom du process d'un exécutable lancé par shellexecute() depuis VFP.

LOCAL iretour AS INTEGER , oProcess AS OBJECT

DECLARE INTEGER ShellExecute IN shell32.DLL ;
  INTEGER hndWin, ;
  STRING cAction, ;
  STRING cFileName, ;
  STRING cParams, ;
  STRING cDir, ;
  INTEGER nShowWin
DECLARE INTEGER OpenProcess IN kernel32;
  INTEGER dwDesiredAccessas,;
  INTEGER bInheritHandle,;
  INTEGER dwProcId

DECLARE INTEGER GetModuleBaseName IN psapi;
  INTEGER  hProcess,;
  INTEGER  hModule,;
  STRING @ lpBaseName,;
  INTEGER  nSize

DECLARE INTEGER CloseHandle IN kernel32;
  INTEGER hObject

iretour = ShellExecute(0;
  ,  "Open";
  , 'c:\windows\system32\' + 'notepad.exe';
  , '';
  , 'c:\windows\system32\';
  , 1)


CREATE CURSOR TProc (ID I, NAME C(20))
oProcess = CREATEOBJECT("ProcessList")
WITH oProcess
  FOR I = 1 TO .COUNT
    INSERT INTO TProc (IDNAMEVALUES(.ITEM(I).nPid, .ITEM(I).cName)
  ENDFOR
ENDWITH
BROWSE NORMAL NOWAIT
oProcess = NULL

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 BASECLASS, CLASS, CLASSLIBRARY, COMMENT, PARENT, PARENTCLASS, TAG

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

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


Cordialement
GLS

Permalink : http://www.atoutfox.org/nntp.asp?ID=0000014833
20 088 messages dans le forum • Liste complète des messages

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