Verificar aplicativo/processo está rodando na memória

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

Verificar aplicativo/processo está rodando na memória

Mensagem por NiltonGM »

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:

Código: Selecionar todos

          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
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Verificar aplicativo/processo está rodando na memória

Mensagem por Claudio Soto »

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Verificar aplicativo/processo está rodando na memória

Mensagem por JoséQuintas »

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:

Código: Selecionar todos

      _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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

Verificar aplicativo/processo está rodando na memória

Mensagem por NiltonGM »

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Verificar aplicativo/processo está rodando na memória

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Verificar aplicativo/processo está rodando na memória

Mensagem por Claudio Soto »

Nilton, todas las funciones que mencioné hacen parte de HMG.3.4.3
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

Verificar aplicativo/processo está rodando na memória

Mensagem por NiltonGM »

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
Claudio Soto
Colaborador
Colaborador
Mensagens: 566
Registrado em: 27 Ago 2012 12:31
Localização: Uruguay
Contato:

Verificar aplicativo/processo está rodando na memória

Mensagem por Claudio Soto »

El nombre esta mal, la funcion esta definida como
EnumProcessesID()
Saludos.
Dr. Claudio Soto
(Uruguay)
http://srvet.blogspot.com
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

Verificar aplicativo/processo está rodando na memória

Mensagem por NiltonGM »

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 do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Verificar aplicativo/processo está rodando na memória

Mensagem por rubens »

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

Código: Selecionar todos

*******************************************************************************   
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 do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

Verificar aplicativo/processo está rodando na memória

Mensagem por NiltonGM »

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 do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Verificar aplicativo/processo está rodando na memória

Mensagem por rubens »

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 do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Verificar aplicativo/processo está rodando na memória

Mensagem por Pablo César »

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.
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Verificar aplicativo/processo está rodando na memória

Mensagem por porter »

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)
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Verificar aplicativo/processo está rodando na memória

Mensagem por rubens »

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ê ???"
Responder