Evitar que un EXE se ejecute mas de una vez

889 views
Skip to first unread message

Dony Bustamante

unread,
Nov 9, 2016, 10:24:40 AM11/9/16
to Comunidad de Visual Foxpro en Español
Hola amigos,

He tenido problemas con algunos de los usuarios de mi sistema porque corren mas de una vez el EXE principal. (llamado asistencia.exe)

Necesito saber la via para evitar que se ejecute mas de una vez el mismo EXE en una PC.

Agradecido  por la ayuda,

Carlos Miguel FARIAS

unread,
Nov 9, 2016, 10:35:59 AM11/9/16
to Grupo Fox
Como no tenía posibilidad de saberlo por S.O. en su momento instrumente archivos "banderas". Ese archivo me indicaba si el sistema estaba activo y que tablas se habían abierto, cuando arrancaba la segunda instancia, se encontraba con el archivo marcado como abierto y la lista de tablas abiertas.
De esa manera al iniciar el sistema operativo, con programita borraba que aplicación estaba activa y cuando el usuario entraba, el sistema si detectaba tablas marcadas como abiertas al intentar abrir, automáticamente corría un proceso de compactado y recuperación de indices. En 20 años, solo dos tablas tuvimos que recuperar del backup por rotas mal.
Usaba para tal tarea un archivo mem que guarda con save to y se recupera con restore from. Fijate la ayuda, es muy fácil y rápido
Saludos: Miguel, La Pampa (RA)

Fernando Maggi

unread,
Nov 9, 2016, 10:45:52 AM11/9/16
to publice...@googlegroups.com

Yo utilizo esto en mi programa inicial :

 

&& Verifico que el programa no se este ejecutando

Local lnWinHandle

Declare Integer FindWindow In Win32API Integer, String

lnWinHandle = FindWindow( 0, "nombre de tu ventana principal”)

If lnWinHandle # 0

 _Screen.Visible=.f.

MESSAGEBOX("EL SISTEMA SE ESTA EJECUTANDO",63,"Advertencia")

QUIT

Endif

 

Saludos,

Fernando.

GeoSys Diseño de Software

unread,
Nov 9, 2016, 11:44:37 AM11/9/16
to Comunidad de Visual Foxpro en Español
Yo utilizo el siguiente código, está basado en un ejemplo en la Web, a mi me a funcionado bien.
Esto lo tengo en el ACTIVATE de mi formulario principal, entonces al iniciar y encontrar la aplicación activa, cierro y traigo la pantalla de la aplicación que ya se está ejecutando.

*- CON EL SIGUIENTE CÓDIGO NO SE EJECUTARÁ MÁS DE UNA VEZ ESTA APLICACIÓN EN LA MISMA COMPUTADORA.
lcCaption = _SCREEN.Caption && Asigno el caption original actual.
_SCREEN.Caption = "_" + lcCaption && Renombro temporalmente el caption de esta aplicación.
*- Ejecuto la appi de windows.
DECLARE INTEGER FindWindow IN WIN32API STRING cNULL, STRING cWinName
DECLARE INTEGER BringWindowToTop IN Win32API INTEGER HWND
DECLARE INTEGER SendMessage IN Win32API INTEGER HWND, INTEGER Msg, INTEGER WParam, INTEGER LPARAM
estactiva = FindWindow(0, lcCaption)
IF estactiva > 0 && Si ya está la aplicación activa, no continúo.
MESSAGEBOX("Este sistema ya se encuentra activo en esta misma computadora, yo activaré la aplicación activa anteriormente.", 16, "Aviso, Ya se encuentra esta aplicación activa en esta misma computadora")
*!* quit && Salgo del sistema.
KEYBOARD '{ESC}' && Salgo de esta aplicación, en mi formulario un escape es Salir.
bringwindowtotop(estactiva) && Mandar la ventana de la aplicación al frente
sendmessage(estactiva, 274, 61488, 0) && Maximizar la ventana 
ELSE 
_SCREEN.Caption = lcCaption && Si no estaba activa asigno el caption original.
ENDIF 
*- TERMINO DE VERIFICAR SI YA ESTÁ LA APLICACIÓN ACTIVA.


Saludos
Anthony Contreras Peralta
Costa Rica.

Germán Fabricio Valdez

unread,
Nov 9, 2016, 1:09:56 PM11/9/16
to Comunidad de Visual Foxpro en Español
esta rutina vale para si tenes el exe en el servidor como en cada cliente ,lo pones en tu prg de inicio al comienzo

vfile="c:\windows\nombredelexe.txt"
if not file(vfile)
   strtofile("",vfile)
endif
va=fopen(vfile,12)
if va=-1
   return
endif

Antonio Meza

unread,
Nov 9, 2016, 1:39:19 PM11/9/16
to Comunidad de Visual Foxpro en Español
y si se bloquea el equipo o se va la luz y el archivo esta creado cuando intente entrar de nuevo dirá que ya esta en uso cuando no es así!!!

Creo que es mejor las 2 opciones anteriores donde se busca si esta corriendo la aplicación.

saludos
Antonio Meza

Carlos Miguel FARIAS

unread,
Nov 9, 2016, 6:45:45 PM11/9/16
to Grupo Fox
Si se bloqueo el equipo, o se corto la luz, o el fulano lo cancelo desde el administrador de tareas, lo más probable es que hayan quedado tablas rotas, o al menos algún indice des-actualizado.
Si al arrancar, el programa le avisa que ya esta corriendo y el tipo ve que no es así, le das una opción de restauración.
Como toda solución, incorporar el método de Fernando o de GeoSys logran una solución mejor.
Además, si la aplicación esta bien desarrollada para múltiples usuarios concurrentes, debería funcionar sin problemas. Salvo por la sobre carga de procesador y memoria.
Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad

Dony Bustamante

unread,
Nov 10, 2016, 12:22:23 PM11/10/16
to Comunidad de Visual Foxpro en Español
Buena, Anthony esta bien este codigo, lo voy a probar gracias
Reply all
Reply to author
Forward
0 new messages