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