Esto esta probado con fwh 10.06
y xharbour la mas reciente.
salu2
carlos vargas
GLOBAL oMutex
procedure main()
....
return
/*-------------------------------------------------------------------------------------------------*/
/*crea un mutex para evitar abrir aplicacion mas de una ocaci贸n*/
INIT PROCEDURE Main_Ini()
聽 聽/*crea objeto tmutex*/
聽 聽oMutex := TMutex():Open( NIL, FALSE, "KDSoft" )
聽 聽/*valida mutex*/
聽 聽IF oMutex:hMutex==0
聽 聽 聽 oMutex := TMutex():Create( NIL, FALSE, "KDSoft" )
聽 聽ELSE
聽 聽 聽 MsgAlert("La aplicaci贸n esta en ejecuci贸n actualmente!")
聽 聽 聽 oMutex:Close()
聽 聽 聽 QUIT
聽 聽ENDIF
RETURN
/*-------------------------------------------------------------------------------------------------*/
/*Elimina mutex creado*/
EXIT PROCEDURE Main_End()
聽 聽IF oMutex != NIL
聽 聽 聽 oMutex:Close()
聽 聽ENDIF
RETURN
/*-------------------------------------------------------------------------------------------------*/
/*archivo cabezera del proyecto*/
#include "fivewin.ch"
/*-------------------------------------------------------------------------------------------------*/
#define iKERNEL 聽 聽 聽 聽 "Kernel32.dll"
#define iASPASCAL 聽 聽 聽 .T.
#define iTRUE 聽 聽 聽 聽 聽 1
#define iFALSE 聽 聽 聽 聽 聽0
#define MUTANT_QUERY_STATE 聽 聽 聽 聽 聽 聽1
#define STANDARD_RIGHTS_REQUIRED 聽 聽 聽983040
#define SYNCHRONIZE 聽 聽 聽 聽 聽 聽 聽 聽 聽 1048576
#define MUTEX_ALL_ACCESS 聽 聽 聽 聽 聽 聽 聽nOr( STANDARD_RIGHTS_REQUIRED, SYNCHRONIZE, MUTANT_QUERY_STATE )
#xtranslate Bool2Int( <lVar> ) 聽=> 聽 聽If( <lVar>, iTRUE, iFALSE )
/*-------------------------------------------------------------------------------------------------*/
CREATE CLASS TMutex
聽 聽DATA cName
聽 聽DATA hMutex
聽 聽METHOD Create( sMutexAttr, lInitialOwner, cName ) CONSTRUCTOR
聽 聽METHOD New( sMutexAttr, lInitialOwner, cName ) INLINE ::Create( sMutexAttr, lInitialOwner, cName )
聽 聽METHOD Open( nAccess, lInitialOwner, cName ) Constructor
聽 聽METHOD Close()
聽 聽METHOD Release()
聽 聽METHOD End() INLINE ::Close()
聽 聽METHOD Failed() HIDDEN
ENDCLASS
/*-------------------------------------------------------------------------------------------------*/
METHOD Create( sMutexAttr, lInitialOwner, cName ) CLASS TMutex
聽 聽LOCAL hDLL 聽 聽:= LoadLibrary( iKERNEL )
聽 聽LOCAL cFunc 聽 := "CreateMutexA"
聽 聽LOCAL cBuffer := NIL
聽 聽LOCAL cFarProc
聽 聽DEFAULT lInitialOwner := .F., cName := "FiveWin App"
聽 聽::hMutex := 0
聽 聽::cName 聽:= ""
聽 聽IF ValType( sMutexAttr ) == "O" .and. Upper( sMutexAttr:className() ) == "TSTRUCT"
聽 聽 聽 cBuffer := sMutexAttr:cBuffer
聽 聽Endif
聽 聽::cName := cName
聽 聽IF Abs( hDLL ) > 32
聽 聽 聽 cFarProc := GetProcAdd( hDLL, cFunc, iASPASCAL, LONG, LONG, LONG, STRING )
聽 聽 聽 ::hMutex := FWCallDLL( cFarProc, 聽iif( cBuffer != NIL, @cBuffer, cBuffer ), Bool2Int( lInitialOwner ), cName + Chr(0) )
聽 聽 聽 FreeLibrary( hDLL )
聽 聽 聽 IF cBuffer != NIL
聽 聽 聽 聽 聽sMutexAttr:cBuffer := cBuffer
聽 聽 聽 ENDIF
聽 聽ELSE
聽 聽 聽 ::Failed( hDLL, cFunc )
聽 聽ENDIF
RETURN Self
/*-------------------------------------------------------------------------------------------------*/
METHOD Open( nAccess, lInitialOwner, cName ) CLASS TMutex
聽 聽LOCAL hDLL 聽 聽:= LoadLibrary( iKERNEL )
聽 聽LOCAL cFunc 聽 := "OpenMutexA"
聽 聽LOCAL cFarProc
聽 聽DEFAULT nAccess := MUTEX_ALL_ACCESS, lInitialOwner := .F., cName := "FiveWin App"
聽 聽::cName := cName
聽 聽IF Abs( hDLL ) > 32
聽 聽 聽 cFarProc := GetProcAdd( hDLL, cFunc, iASPASCAL, LONG, LONG, LONG, STRING )
聽 聽 聽 ::hMutex := FWCallDLL( cFarProc, nAccess, Bool2Int( lInitialOwner ), cName + Chr(0) )
聽 聽 聽 FreeLibrary( hDLL )
聽 聽ELSE
聽 聽 聽 ::Failed( hDLL, cFunc )
聽 聽ENDIF
RETURN Self
/*-------------------------------------------------------------------------------------------------*/
METHOD Close() CLASS TMutex
聽 聽LOCAL hDLL 聽:= LoadLibrary( iKERNEL )
聽 聽LOCAL cFunc := "CloseHandle"
聽 聽LOCAL nResult
聽 聽LOCAL cFarProc
聽 聽IF Abs( hDLL ) > 32
聽 聽 聽 cFarProc := GetProcAdd( hDLL, cFunc, iASPASCAL, LONG, LONG )
聽 聽 聽 nResult 聽:= FWCallDLL( cFarProc, ::hMutex )
聽 聽 聽 FreeLibrary( hDLL )
聽 聽 聽 ::hMutex := 0
聽 聽ELSE
聽 聽 聽 ::Failed( hDLL, cFunc )
聽 聽ENDIF
RETURN nResult
/*-------------------------------------------------------------------------------------------------*/
METHOD Release() CLASS TMutex
聽 聽LOCAL hDLL 聽:= LoadLibrary( iKERNEL )
聽 聽LOCAL cFunc := "ReleaseMutex"
聽 聽LOCAL cFarProc
聽 聽LOCAL nResult
聽 聽IF Abs( hDLL ) > 32
聽 聽 聽 cFarProc := GetProcAdd( hDLL, cFunc, iASPASCAL, LONG, LONG )
聽 聽 聽 nResult := FWCallDLL( cFarProc, ::hMutex )
聽 聽 聽 FreeLibrary( hDLL )
聽 聽ELSE
聽 聽 聽 ::Failed( hDLL, cFunc )
聽 聽ENDIF
RETURN nResult
/*-------------------------------------------------------------------------------------------------*/
METHOD Failed( nError, cFunc ) CLASS TMutex
聽 聽MsgAlert( "Error: " + LTrim( Str( nError ) ) + " al cargar " + iKERNEL + CRLF + "Funci贸n: " + cFunc, "Clase " + ::className() )
RETURN Self
/*-------------------------------------------------------------------------------------------------*/
//EOF
/*-------------------------------------------------------------------------------------------------*/