Jump to content
Fivewin Brasil

IsExeRunning


maudruidas

Recommended Posts

Boa tarde, gostaria que alguém me explicasse como funciona o IsExeRunning(). Compilei meu sistema 2 vezes com nomes diferentes, porém ao abrir o sistema, mesmo com nomes diferentes ele diz que já está aberto.

     IF(IsExeRunning("SISC20.EXE"))
        MsgInfo("O Programa Já Está Aberto, Verifique na Barra de Tarefas do Windows ","Atenção")
        RETURN(NIL)
     ENDIF
 O outro que tento abrir chama SISPF.EXE, mas ele diz que já está aberto.

Link to comment
Share on other sites

Se estiver compilando em Harbour, eu acho que a lógica é outra. Teste ai

   IF ISEXERUNNING( CFILENAME( HB_ARGV( 0 ) ) )

      MsgInfo( "SISC20.EXE Já Está Rodando Nesta Máquina","SISC20.EXE")

      SHOWWINDOW( FINDWINDOW( 0, "SISC20" ), 9 )

      SETFOREGROUNDWINDOW( FINDWINDOW( 0, "SISC20" ) )

      LIBERA_TUDO()

      RETURN NIL

   ENDIF

Link to comment
Share on other sites

Assim, fica mais fácil de entender e sem mensagem, o uçuário nem percebe o que o antigiu, pois o .EXE "sobe" de novo no mesmo lugar.

// \samples\ISEXERUN.PRG
	#Include "FiveWin.ch"
	STATIC oWnd
	FUNCTION Main()
	   // LOCAL oWnd
	   LOCAL cTitle := "This is a test"
	   IF ISEXERUNNING( CFILENAME( HB_ARGV( 0 ) ) )
	      SHOWWINDOW( FINDWND( cTitle ), 9 )
	      SETFOREGROUNDWINDOW( FINDWND( cTitle ) )
	      RETURN NIL
	   ENDIF
	   DEFINE WINDOW oWnd TITLE "Prefix - " + cTitle + " - Postfix"
	   ACTIVATE WINDOW oWnd
	RETURN NIL
	#define GW_HWNDFIRST 0
#define GW_HWNDLAST  1
#define GW_HWNDNEXT  2
#define GW_HWNDPREV  3
#define GW_OWNER     4
#define GW_CHILD     5
	FUNCTION FINDWND( cTitle )
	   LOCAL hWnd := GETWINDOW( GETDESKTOPWINDOW(), GW_CHILD )
	   WHILE hWnd != 0
	      SYSREFRESH()
	      IF Upper( cTitle ) $ Upper( GETWINDOWTEXT( hWnd ) )
	         RETURN( hWnd )
	      ENDIF
	      hWnd = GETWINDOW( hWnd, GW_HWNDNEXT )
	   ENDDO
	RETURN NIL
// FIN / END

Regards, saludos.

Link to comment
Share on other sites

Bom dia, obrigado pela ajuda Kapiaba, porém ainda não deu certo. Fiz desta forma:

     IF ISEXERUNNING( CFILENAME( HB_ARGV( 0 ) ) )
        MsgInfo("O Programa Já Está Aberto, Verifique na Barra de Tarefas do Windows ","Atenção")
        SHOWWINDOW( FINDWINDOW( 0, "SISC20" ), 9 )
        SETFOREGROUNDWINDOW( FINDWINDOW( 0, "SISC20" ) )
        RETURN(NIL)
     ENDIF
mas quando chamo o outro programa SISCPF.EXE ele continua dando a mensagem que já está aberto.

Uso:

xHarbour 21.02

Link to comment
Share on other sites

Desculpe a minha segnolenta dúvida, mas em rede ou ambiente corporativo, o que seria "testar" se o windows encontra um mesmo executável já que no mesmo você pode definir acessos a operaçoes a subsistemas?

Um simples bloqueio a operações não seria o  suficiente já que o caso em questão o nome do executável ser diferente não implica a outro projeto?

 

 

 

Link to comment
Share on other sites

Amiguinhos,

Tente adapatar este trecho no prg principal.

      SOSFile   := "c:\seusistema\" + alltrim(str(nSerialHD("C:")))+".sos"
      if file(SOSFile)
         fErase(SOSFile) // Tenta eliminar o arquivo de controle
         if fError() <> 0 // Se não conseguir...
            if ! MsgNoYes( "O sistema ja se encontra aberto. Veja o icone ao lado do relogio"+CRLF+CRLF+"Deseja abrir novamente?", "Multiplas instancias" )
               quit
            endif
         endif
      endif
      SOSHandle := fCreate(SOSFile) // Cria o arquivo de controle
      SOSHandle := fOpen(SOSFile,1) // Abre travando o arquivo de controle

 

Link to comment
Share on other sites

36 minutos atrás, rochinha disse:

Amiguinhos,

Tente adapatar este trecho no prg principal.


      SOSFile   := "c:\seusistema\" + alltrim(str(nSerialHD("C:")))+".sos"
      if file(SOSFile)
         fErase(SOSFile) // Tenta eliminar o arquivo de controle
         if fError() <> 0 // Se não conseguir...
            if ! MsgNoYes( "O sistema ja se encontra aberto. Veja o icone ao lado do relogio"+CRLF+CRLF+"Deseja abrir novamente?", "Multiplas instancias" )
               quit
            endif
         endif
      endif
      SOSHandle := fCreate(SOSFile) // Cria o arquivo de controle
      SOSHandle := fOpen(SOSFile,1) // Abre travando o arquivo de controle

 

Teu café parece ser o mesmo que o meu mano kkk

Link to comment
Share on other sites

9 horas atrás, Ladinilson disse:

Teu café parece ser o mesmo que o meu mano kkk

O mesmo que o nosso. :D

 

Só para complicar mais um pouco...

 

   // Para avisar ao servidor que aqui o aplicativo está aberto
   cLocal := gete('CLIENTNAME') ; cPref := "CLI:"
   if empty( cLocal )
      cLocal := gete('COMPUTERNAME') ; cPref := "PC:"
   endif
   if empty( cLocal )
      cLocal := gete('USERNAME') ; cPref := "USR:"
   endif
   cApelid := Alltrim(cFileNoExt(HB_ARGV(0)))+"_"+cLocal
   
   cFiSrv := cPasta+"\"+ALLTRIM(cApelid)+".tmp" //
   cFoldr := STRTRAN(UPPER(cPasta), "\DADOS", "\FOTOS")
   cFlXml := STRTRAN(UPPER(cPasta), "\DADOS", "\BKPXML")
   cFlRes := STRTRAN(UPPER(cPasta), "\DADOS", "\resp_nfe")
   cFiLoc := CurDrive()+":\"+CurDir()+"\"+ALLTRIM(cApelid)+".tmp"
   if file(cFiSrv)
      fErase(cFiSrv) // Tenta eliminar o arquivo de controle no servidor.
      if fError() <> 0 // Não excluiu. Sistema já aberto no servidor.
	      fErase(cFiLoc) // Tenta eliminar o arquivo de controle localmente.
	      if file(cFiLoc) // Não excluiu. Sistema já aberto aqui também.
            IF ! lReOpen
               GeneralUnlock() // Remover o bloqueio geral, só para garantir.
	      	   SysRefresh() ; MsgWait("Sistema já aberto!","Atenção!...", 1)
	      	ELSE
               IF MsgNoYes("Sistema já aberto. Gostaria de reinicializar?","Sistema já aberto")
                  cAtuInf := "@ECHO OFF"+CRLF+;
                             "COLOR F1"+CRLF+;
                        	  'TASKKILL /IM '+Alltrim(cFileNoExt(HB_ARGV(0)))+'.EXE /F /FI "USERNAME eq '+gete('USERNAME')+'"'+CRLF+;
                        	  'TIMEOUT /T 2 /NOBREAK'+CRLF+; // Esperar 2 segundos ignorando pressionamento de teclas
                             "START "+Alltrim(cFileNoExt(HB_ARGV(0)))+".EXE"+CRLF+;
                             "EXIT"
                  if file(".\reabrir.bat") ; ferase(".\reabrir.bat") ; endif
                  arq2 := fcreate(".\reabrir.bat")
                  fwrite(arq2, cAtuInf)
                  fclose(arq2)
                  GeneralUnlock() // Remover o bloqueio geral, só para garantir.
                  WAITRUN( GetEnv( 'ComSpec' )+' /C START .\reabrir.bat"', 0 )
                  SysWait(10) // Precisa disso, senão o programa prossegue com a execução
               ENDIF
	      	ENDIF
		      SETFOREGROUNDWINDOW( FINDWINDOW( 0, cFileNoExt(HB_ARGV(0))+" - Gestao Comercial" ) ) // Para evitar erro de codepage, deixar sem acento o titulo da janela principal
		      PostQuitMessage( 0 )
		      QUIT
		   ENDIF
	   ENDIF
   ENDIF
   SRFhnd := fCreate(cFiSrv) // Cria o arquivo de controle no servidor
   SRFhnd := fOpen(cFiSrv,1) // Abre travando o arquivo de controle no servidor
   LOChnd := fCreate(cFiLoc) // Cria o arquivo de controle localmente
   LOChnd := fOpen(cFiLoc,1) // Abre travando o arquivo de controle localmente

 

Link to comment
Share on other sites

2 horas atrás, Ariston Santos disse:

É José Ariston :D

O intuito dessa função é me informar se o EXE está aberto no PC local e/ou no servidor.
Isso me ajuda em algumas decisões, tipo:
Posso atualizar o programa?
Posso reiniciar o servidor?

kkkkkkkkkkkkk, blz. entendi. Mey loko, mas tá valendo. kkkkkk, abs.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...