Página 1 de 3

Impedir que o sistema abra várias vezes

Enviado: 13 Mar 2006 12:37
por Josmar dos Santos
Bom dia pessoal...
Gostaria de saber como impedir que o usuário abra o sistema várias vezes no windows atraves do atalho...sem mais obrigado..
Josmar

Enviado: 14 Mar 2006 03:01
por rochinha
Amiguinho

Este foi um assunto amplamente discutido no forum com muitos exemplos apresentados, mas na busca do forum não me lembro de uma palavra chave para encontra-la.

Se voce usa o BLINKER pode fazer isto:

Código: Selecionar todos

   enable  = .t.
   disable = .f.
   for i = 1 to 5
       if ! SWPGETPID("sistema.exe") // Se o programa nao estiver rodando
          SWPSETPID("sistema.exe")   // Marca-lo em memoria como ativo 
       endif
   next
   if SWPGETPID("nf.exe")       // Se o programa ja estiver rodando
      clear screen
      ? "Aplicativo ja esta em uso NESTA estacao."
      ? "(Digite EXIT para retornar)"
      ? " "
      QUIT
   else
      SWPSETPID("nf.exe")   // Marca-lo em memoria como ativo
   endif
...
Caso precise de algo mais elaborado:

Código: Selecionar todos

FUNCTION SESSAO2( MO_DO )
   IF !FILE("SESSAO.DBF")
      ESTRU_DBF := {}
      AADD( ESTRU_DBF, { "ESTACAO"  , "C", 8, 0 } )
      AADD( ESTRU_DBF, { "DATA"     , "D", 8, 0 } )
      AADD( ESTRU_DBF, { "HORA"     , "C", 8, 0 } )
      AADD( ESTRU_DBF, { "SITUACAO" , "N", 1, 0 } )
      DBCREATE( "SESSAO", ESTRU_DBF )
   ENDIF
   M->ESTACAO := HDSERIAL()
   USE SESSAO SHARED
   LOCATE FOR ESTACAO = M->ESTACAO
   IF MO_DO = 'ON'
      IF !FOUND()
         APPEND BLANK
         SESSAO->ESTACAO  := M->ESTACAO
         SESSAO->DATA     := DATE()
         SESSAO->HORA     := TIME()
         SESSAO->SITUACAO := 1 // 1 Aberto 0 Fechado
         COMMIT
      ELSE
         IF SESSAO->SITUACAO = 0
            SESSAO->DATA     := DATE()
            SESSAO->HORA     := TIME()
            SESSAO->SITUACAO := 1 // 1 Aberto 0 Fechado
            COMMIT
         ELSE
            CLS
            @ 02,00 SAY "O Sistema ja esta sendo executado..."
            RETURN .F.
         ENDIF
      ENDIF
   ELSE
      IF !FOUND()
         APPEND BLANK
         SESSAO->ESTACAO  := M->ESTACAO
         SESSAO->DATA     := DATE()
         SESSAO->HORA     := TIME()
         SESSAO->SITUACAO := 0 // 1 Aberto 0 Fechado
         COMMIT
      ELSE
         RLOCK()
         SESSAO->DATA     := DATE()
         SESSAO->HORA     := TIME()
         SESSAO->SITUACAO := 0 // 1 Aberto 0 Fechado
         COMMIT
      ENDIF
   ENDIF
   RETURN .T.
Ou use isto:

Código: Selecionar todos

...
if file("ativo.atv") // Se o arquivo existe
   ferase("ativo.atv") // tentara apaga-lo
   if ferror() > 0 // Se nao conseguiu é porque ja esta em uso
      ? 'Sistema em uso. Impossivel abrir'
      quit
   endif
   errHD := fCreate( "ativo.atv" ) // Cria o arquivo
   // Abre o mesmo e deixa-o aberto enquanto o sistema estiver ativo
   fOpen( errHD, 1 ) 
endif
...
Para usar esta ultima opção em rede, troque a palavra ativo.atv pela string que devolve o serial do hd.

@braços :?)

Atalho

Enviado: 14 Mar 2006 13:58
por Josmar dos Santos
Ola Rochinha..Sim, de fato eu andei procurando alguma coisa a respeito desse topico, mas te confesso que não encontrei.
Em relação as suas dicas, vou testa-las no meu sistema....
Fico muito grato ..
Um abraço..Josmar

Enviado: 14 Mar 2006 19:49
por Augusto
Rochinha...

Muito me interessou o seu 1o. exemplo porém... fiz o teste e nada aconteceu... assim como tbm não entendi o prq das variáveis "enable" e "disable" uma vez que vc não faz referencia a elas em nenhum momento durante o exemplo e o prq tbm do "for/next"...

Poderia explicar ?? Estaria faltando alguma coisa ??

Grato...

Enviado: 14 Mar 2006 21:25
por Daniel
Rochinha

eu testei os primeiro e o ultimo, nenhum funcionou no XP
Voce teria algum que funcionace no xp

Enviado: 15 Mar 2006 00:43
por rochinha
Amiguinhos

Os codigos postados foram tirados de alguns .PRGs que possuo aqui e portanto não testei, apenas olhei e postei.

Mas aqui esta a verificação e solução para o travamento:

Código: Selecionar todos

...
if !file("ativo.atv")
   // Se o arquivo nao existe, cria-o
   errhandle = fcreate("ativo.atv")
   fwrite(errhandle,"ATV=01")
else
   // Se o arquivo existe tentara apaga-lo
   ferase("ativo.atv")
   if ferror() > 0 // Se nao conseguiu é porque ja esta em uso 
      ? 'Sistema em uso. Impossivel abrir' 
      quit 
   endif 
endif
// Abre o mesmo e deixa-o aberto enquanto o sistema estiver ativo 
errhandle = fopen("ativo.atv",2)
...
// Resto do sistema
Foi testado no Windows 2003 Server em duas janelas DOS abertas em uma unica maquina.

@braços :?)

Enviado: 16 Mar 2006 16:05
por Grings
Caro Rochinha, testei no Xp e não funcionou, abre diversas janelas.

Enviado: 16 Mar 2006 17:01
por Daniel
Rochinha

este ultimo tambem nao funcionou no XP

Enviado: 16 Mar 2006 17:13
por Augusto
Bem... depois de tantos exemplos (e realmente nenhum deles funcionou no XP) com base em um deles, eu fiz um, simplezinho, que funciona... o único problema é que se o sistema for "abortado" babau...

Mas é claro que, com boa vontade e usando de outros métodos esse problema pode ser solucionado...

Código: Selecionar todos

IF !FILE("c:\SESSAO.DBF") 
	ESTRU_DBF := {} 
	AADD( ESTRU_DBF, { "log"  , "C", 1, 0 } ) 
	DBCREATE( "c:\SESSAO", ESTRU_DBF )
ELSE
	alert('Já existe uma janela do sistema aberta - Verifique')
	clear
	quit
ENDIF
Notem que o arquivo "SESSAO.DBF" é criado/excluido no HD da estação...

Enviado: 16 Mar 2006 19:01
por Grings
A rotina abaixo funciona bem, porém não pode haver nenhum Close Databases ou DbCloseAll() durante a execução do programa.

Código: Selecionar todos

If !File('STATUS.DBF')
   aStructure:={}
   AADD(aStructure,{'STATUS', 'L', 01, 0})
   DbCreate('Status.DBF',aStructure)
EndIf

DbUseArea(.T.,NIL,'STATUS.DBF',NIL,.F.,.F.)
If NetErr()
   Alert('O programa ja  esta aberto em outra janela! Pressione qualquer tecla e, apos, maximize-o, com o mouse, na barra de tarefas...', )
   Quit
Else
   Use Status New
EndIf

abrir varias

Enviado: 16 Mar 2006 20:07
por Josmar dos Santos
Caros colegas, se vocês que ja sâo veteranos, estão batendo cabeça, imagine eu que sou iniciante.
mas confesso a vocês que estou anotando todos esses exemplos que vocês estão colocando no tópico..
Josmar

Enviado: 16 Mar 2006 21:50
por Eolo
Josmar,

Eu uso o Clipper 52 e o Blinker 51, e em todos os meus programas tem um tréco que mata esse problema e que funciona em qualquer Windows (98 / ME / XP e 2000): no começo do programa principal, eu abro o próprio EXE, em modo "exclusivo".

Por exemplo, se o seu programa principal se chama APP.EXE e está na pasta CLIENTEX, bota o seguinte no começo dele:
arq1=fopen("c:\clientex\app.exe",2)
if arq1=-1
quit
endi

Roda o EXE e, se você tentar abrir o mesmo EXE em outra janela, vai dar "acesso negado".

No final do seu programa, inclua:
arq1=fclose(arq1)

Faltou luz? Teve que dar um RESET? Sem problemas. Quando reiniciar, a primeira janela do seu EXE vai abrir normalmente...

Eolo

Enviado: 16 Mar 2006 22:22
por Clipper
Isso já foi discutido 3780209673673 de vezes aqui, segue abaixo uma função que funciona em qualquer versão, pode abortar o sistema que não dá pau.

www.sistemabr.cjb.net/tvjanxp.zip

Até logo.

Marcelo

Enviado: 16 Mar 2006 22:59
por Eolo
Marcelo,

Vc sugeriu a mesma coisa, só que usando outro arquivo (CONTROLE.ini). Então, porque criar esse novo arquivo se dá pra usar o próprio EXE?

Além de um arquivo extra, vc gastou 20 e poucas linhas e uma função pra fazer o que eu fiz em 3 linhas... Não entendi o que acrescentou.

Eolo

Enviado: 17 Mar 2006 09:53
por Clipper
Simplesmente pq seu exemplo vai dar pau se o EXE for executado em rede e mais de uma estação precisar chamá-lo.

Simples.

E não venha dizer que basta chamar o EXE do próprio HD, imaginemos que a estação não tenha HD.

Até logo.

Marcelo