Clipper On Line • Ver Tópico - Verificar aplicativo/processo está rodando na memória

Verificar aplicativo/processo está rodando na memória

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Verificar aplicativo/processo está rodando na memória

Mensagempor NiltonGM » 26 Jan 2017 18:30

Pessoal,

Exite alguma função do Harbour para verificar se um aplicativo ou processo está rodando na memória?, Hoje eu consigo saber se o meu próprio executável já está rodando para não abrir outra estância usando o velho truque de criar um arquivo txt e travar ele deixando-o aberto enquanto rodo o aplicativo, uma outra estância do mesmo aplicativo tenta deletar este arquivo se exitir, se não conseguir sabemos que uma estância deste aplicativo já está rodando, mas e quando queremos saber de um terceiro aplicativo se está rodando? Como ler (pegar) do Windows a lista de processos ativos?

Velho truque:
          if File('cte_emuso.01')
             fErase('cte_emuso.01')
             if fError() <> 0
                MessageBoxTimeout('O programa já se encontra em uso!', 'PrintCTe TMS Expresso.Cloud ' + g_cVersao + ': Aviso!', MB_ICONEXCLAMATION, 7000 )
                QUIT
             end
             RegistraLog('Sistema foi interrompido anteriormente')
          end

          p_SOSHandle := fCreate('cte_emuso.01') // Cria o arquivo de controle
          fClose(p_SOSHandle)
          p_SOSHandle := fOpen('cte_emuso.01',1) // Abre travando o arquivo de controle

          RegistraLog('Sistema iniciado (em execução)' )

Nilton Medeiros
nilton@sistrom.com.br
Avatar de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 24 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor Claudio Soto » 26 Jan 2017 20:41

Para impedir que el mismo programa se ejecute dos veces usar:

SET MULTIPLE ON | OFF [ WARNING ]      
 
Impedes Attempts To Run Multiple Instances Of The Application

Para averiguar cuáles son los procesos en ejecución ver:

- GetCurrentProcessID() --> return nProcessID
 
- EnumProcessID () ---> return array { nProcessID1, nProcessID2, ... }
 
- GetWindowThreadProcessID ( hWnd, @nThread, @nProcessID )
     
- IsWow64Process ( [ nProcessID ] ) --> return lBoolean
- return TRUE  if a 32-bit application is running under 64-bit Windows (WOW64)
- return FALSE if a 32-bit application is running under 32-bit Windows
- return FALSE if a 64-bit application is running under 64-bit Windows
Note: WOW64 (Win32 On Win64) is the x86 emulator that allows 32-bit Windows-based applications to running on 64-bit Windows
 
- GetProcessName ( [ nProcessID ] ) --> return cProcessName
 
- GetProcessFullName ( [ nProcessID ] ) --> return cProcessFullName
 
- GetProcessImageFileName ( [ nProcessID ] ) --> return cProcessImageFileName
 
- TerminateProcess ( [ nProcessID ] , [ nExitCode ] )
   
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 555
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 35 vezes
Mens.Curtidas: 166 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor JoséQuintas » 26 Jan 2017 22:24

Valeu, resolveu meu problema.

Comentário sobre a forma como a minigui trata as traduções:
atrapalha resolver certos problemas.

Gastei horas tentando resolver um problema e este post resolveu.

Eu teria resolvido muito antes, caso eu pudesse ter pesquisado a string "Already Running" nos fontes.

Como estão em um array:
      _HMG_MESSAGE [1] := 'Are you sure ?'
      _HMG_MESSAGE [2] := 'Close Window'
      _HMG_MESSAGE [3] := 'Close not allowed'
      _HMG_MESSAGE [4] := 'Program Already Running'
      _HMG_MESSAGE [5] := 'Edit'
      _HMG_MESSAGE [6] := 'Ok'
      _HMG_MESSAGE [7] := 'Cancel'
      _HMG_MESSAGE [8] := 'Apply'
      _HMG_MESSAGE [9] := 'Pag.'


Fica quase impossível de localizar a rotina aonde está essa mensagem.

Nota: Aqui sempre retorna que o programa está rodando, Harbour 3.4, mingw 32 bits, Windows 10 64 bits
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor NiltonGM » 27 Jan 2017 16:31

Claudio Soto ou Zeh, ao usar a função EnumProcessID(), dá erro: "undefined reference to 'ENUMPROCESSID; Não tem uma função tipo GetProcessID( 'PrintCte') que busca o processo pelo nome? Aí sim retornaria um ID ou 0/NIL pra eu saber q não está em execução.
A função que mais se aproxima do que eu preciso é a GetProcessName([id]), porem só é util quando já sabemos de antemão o id do processo, só que esse id altera a cada vez que o aplicativo é executado.
Quanto ao comando SET MULTIPLE ON/OFF, muito show!, Sabem me dizer se o executável com essa linha "SET MULTIPLE OFF" estiver em um Servidor e for invocado por uma estação, ele impede outra instância apenas na estação que invocou mas não em outra, ou só permite a execução um uma estação por vez?
Nilton Medeiros
nilton@sistrom.com.br
Avatar de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 24 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor JoséQuintas » 27 Jan 2017 17:26

A rotina precisa do Windows pra testar se está rodando.
Então é vinculado a uma estação/um Windows.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor Claudio Soto » 27 Jan 2017 19:49

Nilton, todas las funciones que mencioné hacen parte de HMG.3.4.3
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 555
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 35 vezes
Mens.Curtidas: 166 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor NiltonGM » 28 Jan 2017 13:56

Oi Claudio Soto,

Claudio Soto escreveu:Nilton, todas las funciones que mencioné hacen parte de HMG.3.4.3


Utilizo HMG 3.4.3 Stable (32bits), veja na imagem anexa o erro que a função não existe. Será que a Sintax da função está errada?
Anexos
enumprocessid.png
Nilton Medeiros
nilton@sistrom.com.br
Avatar de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 24 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor Claudio Soto » 28 Jan 2017 23:04

El nombre esta mal, la funcion esta definida como
EnumProcessesID()
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar de usuário

Claudio Soto
Colaborador

Colaborador
 
Mensagens: 555
Data de registro: 27 Ago 2012 12:31
Cidade/Estado: Uruguay
Curtiu: 35 vezes
Mens.Curtidas: 166 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor NiltonGM » 29 Jan 2017 10:50

Valeu Claudio Soto,

Funcionou! Agora sim consigo montar uma função que verifica se o processo está ativo ou não pelo Nome buscando no array retornado pela função EnumProcessesID(), só para constar, percebi que os processos do Windows que estão suspensos retornam o nome vazio pela função GetProcessName(nID), sendo o nID retornado no Array pela função EnumProcessesID().
:-Y

Obrigado
Nilton Medeiros
nilton@sistrom.com.br
Avatar de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 24 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor rubens » 29 Jan 2017 11:21

Nilton talvez te ajude a implementar a função...
não conhecia as funções deste post.

*******************************************************************************   
function EstaRodandoKillExe( _cExe, _nKill )
/*
* Verificar se um Exe est  sendo executado e podendo at‚ derrub -lo
* Parametros: _cExe, _nKill
* Retorno: Retorno - .t. se estiver rodando
*
* Autor: toya
*/
local Retorno := .f.
local oScriptObj
local oWmiService
local oListaProcess
local oProcessos

HB_DEFAULT(@_nKill,0)

oScriptObj := CREATEOBJECT( "wbemScripting.SwbemLocator" )
oWmiService := oScriptObj:ConnectServer()
oListaProcess := oWmiService:ExecQuery( "select * from Win32_Process where Name='" + _cExe + "'" )

for Each oProcessos in oListaProcess
   Retorno := .t.
   if _nKill == 2
      oProcessos:Terminate() // mata o _cEXE
   endif
next

return Retorno

*******************************************************************************   
function FechaPrograma( _cExe )
/*
*/
local Retorno := .f.
local oScriptObj
local oWmiService
local oListaProcess
local oProcessos

oScriptObj := CREATEOBJECT( "wbemScripting.SwbemLocator" )
oWmiService := oScriptObj:ConnectServer()
oListaProcess := oWmiService:ExecQuery( "select * from Win32_Process where Name='" + _cExe + "'" )

for Each oProcessos in oListaProcess
   Retorno := .t.
   oProcessos:Terminate() // mata o _cEXE
next

return Retorno


Rubes
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor NiltonGM » 30 Jan 2017 17:02

Rubens,

Testei sua função também, funciona que é uma beleza, mesmo sem entender essa classe 'wbemScripting.SwbemLocator', muito louca! Ela tem um metodo 'ExecQuery()', que que é isso companheiro?!! rs

Abraços
Nilton Medeiros
nilton@sistrom.com.br
Avatar de usuário

NiltonGM
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 393
Data de registro: 05 Jun 2014 23:47
Cidade/Estado: Caieiras/SP
Curtiu: 249 vezes
Mens.Curtidas: 24 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor rubens » 31 Jan 2017 08:12

Bom dia...

Nilton...

Então... na época que precisei disso aí estava tendo problemas com o ACBR que simplesmente congelava... daí fui pesquisando e testando e cheguei a essa função aí... Também não sei muito bem o que e como funciona, mas para mim o importante é que funcionou !!! Não força muito não que o lado de cá espana ... kkkk

Uma coisa que percebi que as vezes a gente fica ligado que comando sql servem somente para banco de dados mas não é o que parece né. Já vi alguns exemplos trabalhando em listas, filas... Este aí é um né... recuperou a lista de programas executados e gerou uma query nele... pelo menos foi o que "deduzi"...

Para mim este é um conceito errado do harbour... Quando estamos migrando vemos o seguinte: 'HArbour é a mesma coisa do clipper', na realidade o harbour é compatível com o clipper né, digamos que aproveita o clipper, mas é um mundo totalmente novo e com um aprendizado duro e longo pela frente... Nom meu pouco conhecimento, até agora não vi nada que não se consiga fazer com o harbour, mais difícil, mas possível...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor Pablo César » 01 Fev 2017 15:18

Aqui tem outro tipo de exemplo feito pelo colega Dave que procura pelo título da janela:

Imagem

http://www.hmgforum.com/viewtopic.php?p=49053#p49053
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor porter » 04 Abr 2018 09:30

Olá pessoal,
Estou reabrindo esse tópico para tirar uma dúvida com relação
a rotina acima postada pelo Rubens, com relação aos parâmetros:
_cExe, seria o nome do executavel do sistema ?
e _nKill o que tem que ser informado nesse parâmetro ?

function EstaRodandoKillExe( _cExe, _nKill )

HARBOUR 3.2.0(dev)
porter
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1024
Data de registro: 10 Dez 2009 15:44
Cidade/Estado: OLIMPIA-SP
Curtiu: 3 vezes
Mens.Curtidas: 23 vezes

Verificar aplicativo/processo está rodando na memória

Mensagempor rubens » 04 Abr 2018 14:14

Poter...

Foi uma função tirada de outra função... não sei para que serve o nKill e nem tentei executar sem ele para ver se realmente precisa... já o o _cExe é sim o nome do programa que você quer ver se está rodando... pelo que testei tem que ser exatamente o nome do executável, no meu caso uso para ver se o acbrmonitor está em execução daí se o executável do seu aplicativo é AcbrMonitor.exe e colocar acbrmonitor.exe não vai funcionar..

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Próximo



Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro