Impedir que o sistema abra várias vezes

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

Eolo, linkando com o Blinker 7 sua rotina não abre o programa nem na primeira vez ...

Certa vez teve alguém que postou resposta aqui no fórum dizendo que sua rotina verificava se o atalho estava ativo, não lembro quem e nem quando foi isso...
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Mensagem por Daniel »

depois de esquentar os dedos. achei no ng do clipper 53 a solução

o 16 abre o arquivo e modo exclusivo

Arrumei ele pois em 6 maquinas com o xp, em duas nao funcionou como estava antes e nem no win 98.

agora ficou legal

Código: Selecionar todos

**********************************
Function TravaJan()

	if ! file("C:\DBF1\CONTROLE.SYS")
   	errhandle:= fcreate("C:\DBF1\CONTROLE.SYS", 1)
	   fwrite(errhandle,"[ Arquivo de Controle do Sistema ]")
                   FClose(errhandle)
	   errhandle:= fopen("C:\DBF1\CONTROLE.SYS",16)
	   if ferror() > 0
   		Cls
      	Alert("O Sistema ja esta sendo executado! Olhe na barra de tarefa...")
      	Return(.f.)
   	endif
	else
		errhandle:= fopen("C:\DBF1\CONTROLE.SYS",16)
   	if ferror() > 0
   		Cls
      	Alert("O Sistema ja esta sendo executado! Olhe na barra de tarefa...")
      	Return(.f.)
   	endif
   EndIf
	Return(.t.)
Editado pela última vez por Daniel em 17 Mar 2006 21:39, em um total de 1 vez.
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
Avatar do usuário
Augusto
Usuário Nível 3
Usuário Nível 3
Mensagens: 473
Registrado em: 26 Ago 2003 17:50
Localização: Maricá/RJ
Contato:

Mensagem por Augusto »

Parceiros Marcelo e Daniel...

Lamento informar mas... Nenhum dos 2 exemplos funcionam no XP...

Continuo entrando no mesmo sistema 4664276536 vezes simultâneamente....
:xau Fui...
goulart@provsul.com.br

Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Marcelo,

Você tem razão, mas se for só um EXE para todas as estações usarem simultaneamente. Eu uso vários EXE, um para cada estação/aplicação.

É que eu alugo meus sistemas por mês e por estação, então crio um EXE específico para cada estação, com prazos de validade independentes (anotados dentro deles mesmos), ficando cada EXE em um HD local ou todos juntos no servidor (quando não há HD local).

Com isso, meus clientes ficam livres para decidir quais EXE eles vão querer atualizar: o cliente X, por exemplo, com 5 atendentes (5 EXE), pode resolver pagar só por 3 EXE em abr-2006, já que 2 atendentes vão sair de férias. Sem problema:
- os 2 EXE não atualizados não vão rodar porque expirou a validade;
- 3 EXE atualizados vão rodar e, se houver a tentativa de um segundo acesso simultaneo (local ou via rede) a um deles, vai aparecer o "acesso negado".

E, como eu guardo a data de validade (entre outras informações, como senhas, impressora padrão etc.) dentro de cada EXE, não preciso usar arquivos extras de configuração. Fica, como vc diz, mais simples.

Abraço.

Eolo
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Grings,
Eu uso o Clipper52 e o Blinker51, funciona beleza.
Não testei o Blinker7, vou fazer isso.
Abraço.
Eolo
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Grings,

Testei com o Clipper52e e o Blinker70, rodando no XP Pro: funcionou normal! O próprio EXE foi aberto (read/write) sem problemas.

Eolo
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

O problema é que eu tenho um cliente com 12 estações burras (sem HD) acessando um servidor Linux, neste caso não tem como eu ter um EXE no HD então só funciona da forma que eu postei.

Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

Eolo,

Para testar o que está acontecendo fiz o seguinte:

@ 10,20 Say Arq1:=Fopen(´C:\Orcament\Orcament.exe´,2)

O resultado foi -1 no primeiro acesso.

Uso Clipper 5.2e e o Blinker 7.0.

Agora lhe pergunto pq não entendí sua lógica: Se o arquivo já está sendo executado parece ser claro o que está ocorrendo, não é possível abrí-lo com Fopen na primeira vez e o retorno é -1 ...
Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem por filizola »

uso assim:

Código: Selecionar todos

cls
use usuario index usuario shared
nomeusu=left(alltrim(netname()),8)
dbseek(nomeusu,.f.)
if !found()
   append blank
   repla usuario with nomeusu, ativo with .t.
   unlock
   elseif ativo
   alert("Programa Ja  Esta  Aberto Nesta Estacao !!")
   cls
   quit
   else
   rlock()
   repla ativo with .t.
   unlock
endif
alert("Beleza, posso usar o programa !!!")
sele usuario
dbseek(nomeusu,.f.)
rlock()
repla ativo with .f.
cls
quit
Editado pela última vez por Pablo César em 23 Mar 2013 04:55, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Grings,

O sistema operacional, quando abre o EXE, não o faz "exclusive". Se fosse assim, essa nossa discussão toda não teria sentido, já que um segundo acesso ao EXE não seria possível automaticamente, certo?...

Então, nada impede que o próprio EXE, carregado na memória, abra o EXE no disco. Com o FOPEN("...",2), aí sim, ele fica "exclusive", porque ele é aberto como leitura/escrita.

Eu, em meus programas, uso desde sempre esse processo, para guardar (dentro do EXE) senhas, data de vencimento, etc. etc. Como eu uso o Clipper52c e Blinker51, testei aqui com Clipper52c e Blinker70 e também pedi para um amigo meu, de Portugal, fazer a mesma coisa (Clipper 52e e Blinker70). Funcionou tudo sem problemas.

Uma única coisa que me ocorre agora: eu uso o modo PROTEGIDO. Vc também?

Abraço.

Eolo
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Grings,

Para reforçar o que eu disse: todos os meus sistemas têm uma data de vencimento e ela fica gravada dentro do EXE. Quando vence o prazo, eu mando um arquivo para cada cliente, com 14bytes, contendo informações para "carregar" mais um mês. Aí uma rotina, no meu programa, lê esse arquivo de atualização, desencripta ele e grava uma nova data de vencimento, via FOPEN() e FWRITE(), no próprio arquivo EXE que está rodando na mémória...

Uso isso há anos.

Eolo
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Mensagem por Daniel »

depois de esquentar os dedos. achei no ng do clipper 53 a solução

o 16 abre o arquivo e modo exclusivo

Arrumei ele pois em 6 maquinas com o xp, em duas nao funcionou como estava antes e nem no win 98.

agora ficou legal

Código: Selecionar todos


If ! TravaJan()
   Cls
   Quit
EndIf

********************************
Function TravaJan() 

   if ! file("C:\DBF1\CONTROLE.SYS") 
      errhandle:= fcreate("C:\DBF1\CONTROLE.SYS", 1) 
      fwrite(errhandle,"[ Arquivo de Controle do Sistema ]") 
      FClose(errhandle) 
      errhandle:= fopen("C:\DBF1\CONTROLE.SYS",16) 
      if ferror() > 0 
         Cls 
         Alert("O Sistema ja esta sendo executado! Olhe na barra de tarefa...") 
         Return(.f.) 
      endif 
   else 
      errhandle:= fopen("C:\DBF1\CONTROLE.SYS",16) 
      if ferror() > 0 
         Cls 
         Alert("O Sistema ja esta sendo executado! Olhe na barra de tarefa...") 
         Return(.f.) 
      endif 
   EndIf 
   Return(.t.) 
Daniel

Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

Eolo,

Não uso modo protegido ...
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

Corrigindo a rotina que postei logo no início ...

Código: Selecionar todos

DbUseArea(.F.,NIL,'STATUS.DBF',NIL,NIL,.T.)
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.DBF New
EndIf
Desde que que não seja usado um DbCloseAll() ou Close Databases...
Editado pela última vez por Pablo César em 23 Mar 2013 04:55, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

Impedir varias vezes

Mensagem por Josmar dos Santos »

Ola galera, pelos exemplos que eu vi, todos são linkados com blinker. eu ainda estou me adaptando com o mesmo. Atualmente eu uso o rtlink. Da para linkar com ele ???
grato
Josmar
Responder