Boa tarde a todos !
Esse tópico é antigo e essa solução apresentada por mim também é mas sempre me serviu.
Ela verifica se o programa (executável) já está rodando .
No meu caso não usei passagem de nome de arquivo como parâmetro na função pois é para verificar sempre os os mesmos nomes: "A_MENU1.EXE" ou o conteúdo da variável "NOME_CLIENTE", mas é possível implementa-la da forma que quiser.
Ela consiste em rodar o tasklist.exe>arq_log.txt e depois lê esse arquivo.
Uso no windows 10 em março de 2021 e ainda funciona bem.
Primeiro a chamada para a função:
Código: Selecionar todos
//-----------------------------------------------------------------------------
// Aqui verifica o numero de vezes que esta aberto esse executavel e coloca um numero de referencia nele....
//-----------------------------------------------------------------------------
PUBLIC NOME_CLIENTE:="DINAMICA"
TEMPORARIO="ZYX_"
NUMERO_DO_APP=VER_NUM_TELAS()
IF NUMERO_DO_APP>3
ALERT("N" + CHR( 163 ) + "mero de aberturas excedido.;Existem 3 telas abertas do sistema!")
close all
quit
ENDIF
//-----------------------------------------------------------------------------
Agora a função:
Código: Selecionar todos
//
// Esta funcao varre o tasklist para ver se o programa ja esta rodando
// Nesse caso o A_MENU1.EXE ou o contido variavel NOME_CLIENTE
//
FUNCTION VER_NUM_TELAS()
local AA,BB,CC,DD,UM
//--- Se existir um arquivo de LOG anterior, entao apaga ele
AA=TEMPORARIO+"LOG.TXT"
IF FILE(AA) // NAO USAR LETO_FILE, eh para verificacao local
ERASE &AA
ENDIF
//--- Monta a query
AA="TASKLIST>"+TEMPORARIO+"LOG.TXT"
//--- Executa a query
//--- Colocando dentro do arquivo TXT de log a relacao de todos arquivos rodando no PC
HB_RUN (AA)
AA=TEMPORARIO+"LOG.TXT"
UM=MEMOREAD(AA)
CC=NOME_CLIENTE+".EXE"
DD=0
//--- AQUI verifica se ha outro programas abertos no computador local ------
FOR F=1 TO MLCOUNT(UM,100) // Quantidade de linhas (memoline) em UM ate 100 colunas.
BB=MEMOLINE(UM,100,F) // Atribui a BB ate 100 caracteres da linha F do arquivo de LOG gerado
IF "A_MENU1.EXE"$UPPER(BB) .OR. CC$UPPER(BB) // Verifica de nessa linha tem um dos arquivos mencionado
DD++ // Se houver entao incrementa a variavel DD
*ALERT("ENCONTRADA "+STR(DD)+" OCORRENCIA")
ENDIF
NEXT
//--- Apaga o arquivo de LOG gerado.
AA=TEMPORARIO+"LOG.TXT"
IF FILE(AA) // NAO USAR LETO_FILE, eh para verificacao local
ERASE &AA
ENDIF
RETURN DD
Aqui a mesma função porém enxuta utilizando o comando Hb_ProcessRun:
Código: Selecionar todos
//
// Esta funcao varre o tasklist para ver se o programa ja esta rodando
// Nesse caso o A_MENU1.EXE ou o contido variavel NOME_CLIENTE
//
FUNCTION VER_NUM_TELAS()
local AA, BB, CC:=NOME_CLIENTE+".EXE" , DD:=0 , UM:=""
//--- Aqui coloca o resultado do comando TASKLIST dos DOS na variavel UM
// nResult := hb_ProcessRun( cCommand, [cStdIn], [@cStdOut], [@cStdErr], [lDetach] )
AA= hb_processRun( "tasklist" ,, @UM,, .t. )
//--- AQUI verifica se ha outro programas abertos no computador local ------
FOR F=1 TO MLCOUNT(UM,100) // Quantidade de linhas (memoline) em UM ate 100 colunas.
BB=MEMOLINE(UM,100,F) // Atribui a BB ate 100 caracteres da linha F do arquivo de LOG gerado
IF "A_MENU1.EXE"$UPPER(BB) .OR. CC$UPPER(BB) // Verifica de nessa linha tem um dos arquivos mencionado
DD++ // Se houver entao incrementa a variavel DD
*ALERT("ENCONTRADA "+STR(DD)+" OCORRENCIA")
ENDIF
NEXT
RETURN DD