Página 2 de 3

Enviado: 17 Mar 2006 10:53
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...

Enviado: 17 Mar 2006 11:09
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.)

Enviado: 17 Mar 2006 11:42
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....

Enviado: 17 Mar 2006 11:48
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

Enviado: 17 Mar 2006 11:56
por Eolo
Grings,
Eu uso o Clipper52 e o Blinker51, funciona beleza.
Não testei o Blinker7, vou fazer isso.
Abraço.
Eolo

Enviado: 17 Mar 2006 12:37
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

Enviado: 17 Mar 2006 15:52
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

Enviado: 17 Mar 2006 17:30
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 ...

Enviado: 17 Mar 2006 20:04
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

Enviado: 17 Mar 2006 20:21
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

Enviado: 17 Mar 2006 20:30
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

Enviado: 17 Mar 2006 21:46
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.) 

Enviado: 17 Mar 2006 23:06
por Grings
Eolo,

Não uso modo protegido ...

Enviado: 17 Mar 2006 23:13
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...

Impedir varias vezes

Enviado: 18 Mar 2006 17:15
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