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
Has thanked: 100 times
Been thanked: 179 times

Ejecutar una sola vez la aplciación

Post by Pablo César » Fri Mar 02, 2012 12:45 pm

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: 5222
Joined: Tue Jul 29, 2008 6:30 pm
DBs Used: MariaDB, SQLite, SQLCipher and MySQL
Location: Sivakasi, India
Has thanked: 158 times
Been thanked: 153 times
Contact:

Post by Rathinagiri » Fri Mar 02, 2012 1:51 pm

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

Post by Hazael » Wed Mar 20, 2013 2:39 pm

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
Been thanked: 1 time

Post by CarlosRD » 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.
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

Post by Hazael » Thu Mar 21, 2013 5:57 am

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
Has thanked: 100 times
Been thanked: 179 times

Post by Pablo César » Fri Apr 07, 2017 2:25 pm

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: 186
Joined: Sun Jan 10, 2010 7:05 pm
DBs Used: DBF
Location: España - Spain
Has thanked: 1 time
Been thanked: 1 time

Post by JALMAG » Thu Jan 04, 2018 6:43 pm

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