Ejecutar una sola vez la aplciación

HMG en Español

Moderator: Rathinagiri

User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Ejecutar una sola vez la aplciación

Post 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
Last edited by Pablo César on Sat Mar 25, 2017 10:00 am, edited 1 time in total.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
User avatar
Rathinagiri
Posts: 5471
Joined: Tue Jul 29, 2008 6:30 pm
DBs Used: MariaDB, SQLite, SQLCipher and MySQL
Location: Sivakasi, India
Contact:

Re: Ejecutar una sola vez la aplciación

Post by Rathinagiri »

Wow! Thanks a lot.
East or West HMG is the Best.
South or North HMG is worth.
...the possibilities are endless.
User avatar
Hazael
Posts: 109
Joined: Thu Jun 24, 2010 11:37 am
Location: France

Re: Ejecutar una sola vez la aplciación

Post 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.
Harbour | GTWVT | MingW | Visual Studio Code
User avatar
CarlosRD
Posts: 63
Joined: Thu Jan 31, 2013 9:20 pm
Location: Orizaba, México

Re: Ejecutar una sola vez la aplciación

Post 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.
Todo en el Nombre de Jesus / All in the name of Jesus
Carlos RD
User avatar
Hazael
Posts: 109
Joined: Thu Jun 24, 2010 11:37 am
Location: France

Re: Ejecutar una sola vez la aplciación

Post 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...
Harbour | GTWVT | MingW | Visual Studio Code
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Re: Ejecutar una sola vez la aplciación

Post 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.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
JALMAG
Posts: 262
Joined: Sun Jan 10, 2010 7:05 pm
DBs Used: DBF, MariaDB
Location: España - Spain

Re: Ejecutar una sola vez la aplciación

Post 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.
Post Reply