Page 2 of 2

Ejecutar una sola vez la aplciación

Posted: Fri Mar 02, 2012 12:45 pm
by Pablo César
Puedes tambien utilizar este ejemplo:

Code: Select all

#include "minigui.ch"
#define APP_TITLE 'Mi Programa'
#define MsgAlert( c ) MsgEXCLAMATION( c, "Atencion", , .f. )

Function Main ()
Local hWnd

IF IsExeRunning( cFileNoPath( HB_ArgV( 0 ) ) )
	MsgAlert( "El programa " + APP_TITLE + " yá estaba siendo ejecutado!" )
	
	hWnd := FindWindow( APP_TITLE )
	IF hWnd > 0
		IF IsIconic( hWnd )
			Restore( hWnd )
		ELSE
			SetForeGroundWindow( hWnd )
		ENDIF
	ELSE
		MsgStop( "No es possible encontrar el programa !", "Error", , .f. )
	ENDIF
ELSE

DEFINE WINDOW Form1 ;
   AT 0,0 ;
   WIDTH 320 ;
   HEIGHT 240 ;
   TITLE "Mi Programa" ;
   MAIN
END WINDOW
CENTER WINDOW Form1
ACTIVATE WINDOW Form1

ENDIF
Return Nil

#pragma BEGINDUMP

#define HB_OS_WIN_USED
#define _WIN32_WINNT 0x0400

#include <windows.h>
#include "hbapi.h"
#include "hbapiitm.h"

HB_FUNC( ISICONIC )
{
   hb_retl( IsIconic( ( HWND ) hb_parnl( 1 ) ) );
}

HB_FUNC ( FINDWINDOW )
{
   hb_retnl( ( LONG ) FindWindow( 0, hb_parc( 1 ) ) );
}

HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult
{
   HANDLE hMutex = CreateMutex( NULL, TRUE, ( LPTSTR ) hb_parc(1) );

   hb_retl( GetLastError() == ERROR_ALREADY_EXISTS );

   ReleaseMutex( hMutex );
}

#pragma ENDDUMP

Re: Ejecutar una sola vez la aplciación

Posted: Fri Mar 02, 2012 1:51 pm
by Rathinagiri
Wow! Thanks a lot.

Re: Ejecutar una sola vez la aplciación

Posted: Wed Mar 20, 2013 2:39 pm
by Hazael
Hello,

I just want to share what worked fine to me:

Code: Select all

   LOCAL cProgName, cProgExt, pMutex
   
   /////////////////////////////////////////////////////////////////////////////
   // Avoid multiple execution

   hb_FNameSplit( hb_progname(), NIL, @cProgName, @cProgExt ) // Find the name of the program f.e.: 'MAILEX.exe'

   pMutex := wapi_CreateMutex(NIL, NIL, cProgName + cProgExt )

   IF wapi_GetLastError() == 183 // ERROR_ALREADY_EXISTS
      MsgInfo( "Multiple instances are not allowed!", "Warning" )
      ExitProcess(0)
   ENDIF
I hope it will help someone else.

Re: Ejecutar una sola vez la aplciación

Posted: Wed Mar 20, 2013 4:45 pm
by CarlosRD
JALMAG wrote:Se que está por algún ejemplo...pero ahora no lo veo, la pregunta es ¿como puedo evitrar abrir dos veces mi aplicación?, es decir, evitar que se ejecute de nuevo si ya está abierta.

Gracias amigos, sois muy amables.
hola jalmag:
otro modo, talvez mas arcaico, pero me funciona, es tener un control.dbf en donde guardas toda la informacion de variables publicas.
al iniciar tu main(), incluso, antes de declarar tu ventana principal, se abre el control.dbf y guardas en memoria todas esas variables (tipos de letras, mascaras, ultimos folios grabados, etc). de este modo puedes corroborar con una variable logica si tu aplicacion ya esta abrierta.

saludos.

Re: Ejecutar una sola vez la aplciación

Posted: Thu Mar 21, 2013 5:57 am
by Hazael
Hello Carlos,

This method may have a flaw.
What happens if the program crashes for any reason (specially because of external factors like the OS itself) ?
We should always make the programs "bullet proof" as much as possible.
Just a consideration...

Re: Ejecutar una sola vez la aplciación

Posted: Fri Apr 07, 2017 2:25 pm
by Pablo César
A los que necesiten evitar que la aplicación sea ejecutada en multipla veces y
además desea que el programa se restablezca en la misma posición de la que ya estaba en ejecución.
Podés accesar este tópico:

viewtopic.php?p=50650#p50650

Hé hecho la propuesta/indicación para alterar la actual funcion IsExeRunning.
Agregandole como opción un parámetro para fin de que retorne el handle de la sesion que estaba abierta.

De esta forma podríamos manipular los windows abiertos.

Re: Ejecutar una sola vez la aplciación

Posted: Thu Jan 04, 2018 6:43 pm
by JALMAG
CarlosRD wrote: Wed Mar 20, 2013 4:45 pm
JALMAG wrote:Se que está por algún ejemplo...pero ahora no lo veo, la pregunta es ¿como puedo evitrar abrir dos veces mi aplicación?, es decir, evitar que se ejecute de nuevo si ya está abierta.

Gracias amigos, sois muy amables.
hola jalmag:
otro modo, talvez mas arcaico, pero me funciona, es tener un control.dbf en donde guardas toda la informacion de variables publicas.
al iniciar tu main(), incluso, antes de declarar tu ventana principal, se abre el control.dbf y guardas en memoria todas esas variables (tipos de letras, mascaras, ultimos folios grabados, etc). de este modo puedes corroborar con una variable logica si tu aplicacion ya esta abrierta.

saludos.
¡¡Gracias Carlos!! Buenísima idea.