FoxPro/Visual FoxPro - Validar ejecución

 
Vista:
sin imagen de perfil
Val: 2
Ha aumentado su posición en 4 puestos en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Validar ejecución

Publicado por Santiago (42 intervenciones) el 30/10/2006 22:39:12
Hola a todos.

¿Me podría alguien decir cómo puedo saber si el programa que estoy ejecutando ya se encuentra corriendo en el PC? No quiero que sea ejecutado dos veces. Inclusive, lo ideal es que al ejecutarlo por segunda vez, simplemente active la ventana de la primera ejecución.

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

RE:Validar ejecución

Publicado por Ernesto Hernandez (4623 intervenciones) el 30/10/2006 23:11:51
Prueba esta funcion del compañero Pablo Roca


Funcion: Is_Run
* Indica si un programa está en ejecución
* Parametros:
* tcprograma - Nombre del programa a comprobar
* Ejemplos:
* llret = Is_Run("GESTION.EXE")
* llret = Is_Run("GESTION")
* Retorno:
* .F. - El programa no está en ejecución
* .T. - El programa está en ejecución
* Notas:
* Si no se pone extensión, se asume EXE por defecto.
*
* Adaptación de código realizado por Carlos Salina
* http://www.portalfox.com/article.php?sid=329
* Creación : 14/02/2006 Pablo Roca
* Ultima Modificacion: 25/02/2006 Pablo Roca
*
* comprueba si consultamos el programa actual en ejecución
* y si se está corriendo solo una vez dice que no se esta ejecutando
* necesita VFP7 o superior
************************************************************
FUNCTION IS_RUN(tcprograma)

#DEFINE PROCESS_VM_READ 16
#DEFINE PROCESS_QUERY_INFORMATION 1024
#DEFINE DWORD 4

*--------------------------------------------------
* Declaración de Funciones API
*--------------------------------------------------
DECLARE INTEGER GetLastError IN kernel32
DECLARE INTEGER CloseHandle IN kernel32 INTEGER Handle
DECLARE INTEGER OpenProcess IN kernel32;
INTEGER dwDesiredAccessas, INTEGER bInheritHandle,;
INTEGER dwProcId
DECLARE INTEGER EnumProcesses IN psapi;
STRING @ lpidProcess, INTEGER cb,;
INTEGER @ cbNeeded
DECLARE INTEGER GetModuleBaseName IN psapi;
INTEGER hProcess, INTEGER hModule,;
STRING @ lpBaseName, INTEGER nSize
DECLARE INTEGER EnumProcessModules IN psapi;
INTEGER hProcess, STRING @ lphModule,;
INTEGER cb, INTEGER @ cbNeeded

LOCAL lcProcBuf, lnBufSize, lnProcessBufRet, lnProcNo, lnProcId,;
hProcess, lcModBuf, lnModBufRet, lcBasename, lcst, llret

LOCAL laprocesos(1,2), lcpbase

tcprograma = UPPER(tcprograma)
IF EMPTY(JUSTEXT(tcprograma))
tcprograma = tcprograma + ".EXE"
ENDIF

lnBufSize = 4096
lcProcBuf = Repli(Chr(0), lnBufSize)
lnProcessBufRet = 0

IF EnumProcesses (@lcProcBuf, lnBufSize, @lnProcessBufRet) = 0
? "Error code:", GetLastError()
RETURN
ENDIF

lcst = ""
FOR lnProcNo=1 TO lnProcessBufRet/DWORD
lnProcId = buf2dword(SUBSTR(lcProcBuf, (lnProcNo-1)*DWORD+1, DWORD))

hProcess = OpenProcess (PROCESS_QUERY_INFORMATION +;
PROCESS_VM_READ, 0, lnProcId)

IF hProcess > 0

lnBufSize = 4096
lcModBuf = Repli(Chr(0), lnBufSize)
lnModBufRet = 0

IF EnumProcessModules(hProcess,@lcModBuf,lnBufSize,@lnModBufRet) > 0

hModule = buf2dword(SUBSTR(lcModBuf,1, DWORD))

lcBasename = SPACE(250)
lnBufSize = GetModuleBaseName (hProcess, hModule,;
@lcBasename, Len(lcBasename))
lcBasename = UPPER(Left (lcBasename, lnBufSize))

lnpos = ASCAN(laprocesos,lcBasename,1,ALEN(laprocesos,1),1,8)

IF lnpos > 0
laprocesos(lnpos,2)=laprocesos(lnpos,2)+1
ELSE
laprocesos(ALEN(laprocesos,1),1)=lcBasename
laprocesos(ALEN(laprocesos,1),2)=1
DIMENSION laprocesos(ALEN(laprocesos,1)+1,2)
ENDIF

ENDIF
= CloseHandle (hProcess)
ENDIF
ENDFOR

DIMENSION laprocesos(ALEN(laprocesos,1)-1,2)
lnpos = ASCAN(laprocesos,tcprograma,1,ALEN(laprocesos,1),1,8)

IF lnpos>0
lcpbase = JUSTFNAME(SYS(16,0))
IF lcpbase=tcprograma
IF laprocesos(lnpos,2)>1
llret = .T.
ELSE
llret = .F.
ENDIF
ELSE
llret = .T.
ENDIF
ELSE
llret = .F.
ENDIF

RETURN llret
ENDFUNC

FUNCTION buf2dword (lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
Asc(SUBSTR(lcBuffer, 2,1)) * 256 +;
Asc(SUBSTR(lcBuffer, 3,1)) * 65536 +;
Asc(SUBSTR(lcBuffer, 4,1)) * 16777216
ENDFUNC


Es muy buena

Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2
Ha aumentado su posición en 4 puestos en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

RE:Validar ejecución

Publicado por Santiago (42 intervenciones) el 31/10/2006 20:17:10
Procederé a probarla.

Muchísimas gracias, Ernesto. Y, por supuesto, muchísimas gracias a Pablo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar