Saber se um executável está rodando..??

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Dércio_Luiz_Zanatta
Usuário Nível 3
Usuário Nível 3
Mensagens: 153
Registrado em: 11 Jan 2006 15:37
Localização: Ibirubá - RS

Saber se um executável está rodando..??

Mensagem por Dércio_Luiz_Zanatta »

Ola pessoal...
Tem como saber se um executável já está rodando ?
O objetivo é não permitir que o usuário abra o mesmo excutável mais de uma vez...
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Buenas,
Em modo console puro eu uso um exemplo que foi postado pelo EOLO, bem simples:

Código: Selecionar todos

*******************
Function Exe_Aberto
*******************
vDIR_TEMP := GETENV("temp")
arq=vDIR_TEMP+"\aberto.txt"
if !file(arq)
   arqh=fcreate(arq,0)
   if !arqh>0
      MsgStop("Atenção !!! Erro ao Iniciar o Sistema, Favor tente Novamente !!!","Aviso do Sistema")
      quit
   endif
   txt="ABERTO"
   txt_t=fwrite(arqh,txt)
   if !txt_t=len(txt)
      MsgStop("Atenção !!! Erro ao Iniciar o Sistema, Favor tente Novamente !!!","Aviso do Sistema")
      quit
   endif
   fclose(arqh)
endi
janela2=fopen(arq,18)
if !janela2>0
   Msginfo("O Sistema Já  Esta Aberto nessa Estação !!!","Aviso do Sistema")
   quit
endi
rele arq, arqh, janela2, txt, txt_t
Return
Em aplicativos que uso a WHAT32.LIB ai uso o seguinte abaixo:

Código: Selecionar todos

If (empty(CreateMutex(  .T., strtran(GetModuleFileName(),"\",'_') )) .or. (GetLastError() > 0 ) )
   MsgInfo("Sistema Já Aberto nessa Estação")
   __Quit()
endif
E por ultimo onde uso HWGUI, ai uso o seguinte abaixo, foi dica do MARCELOG:

Código: Selecionar todos

IF ( hWnd := Hwg_FindWindow( oTelaPrincipal,"TITULO DA JANELA PRINCIPAL" ) ) != 0
   Hwg_SetForegroundWindow( hWnd )
   Return
ENDIF
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Dércio_Luiz_Zanatta
Usuário Nível 3
Usuário Nível 3
Mensagens: 153
Registrado em: 11 Jan 2006 15:37
Localização: Ibirubá - RS

Mensagem por Dércio_Luiz_Zanatta »

Não sei se estou errado, mas no exemplo do EOLO, se eu der um CTRL+ALT+DEL, ou abortar com ALT+C... Quando tentar acessar novamente, vai dizer que está aberto.. certo ?

Estou usando Xharbour e gostaria de saber se um processo está rodando no Windows, ou seja, quero saber quais os executáveis da lista do Ctrl+Alt+Del do windows...
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Dércio_Luiz_Zanatta escreveu:Não sei se estou errado, mas no exemplo do EOLO, se eu der um CTRL+ALT+DEL, ou abortar com ALT+C... Quando tentar acessar novamente, vai dizer que está aberto.. certo ?
Não, ele vai funcionar normal, pode fazer o teste, a questão não esta na existencia do arquivo e sim em abrir o mesmo em modo exclusivo.
Estou usando Xharbour e gostaria de saber se um processo está rodando no Windows, ou seja, quero saber quais os executáveis da lista do Ctrl+Alt+Del do windows...
Veja se o link abaixo ajuda.
http://www.fivewin.com.br/forum/topic.asp?TOPIC_ID=9833
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Em uma aplicação Windows o usual é criar um MUTEX mesmo. Esse esquema de arquivo é coisa de Clipper/DOS.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
carlos_dornelas
Usuário Nível 3
Usuário Nível 3
Mensagens: 400
Registrado em: 25 Ago 2004 21:54

Mensagem por carlos_dornelas »

Se linkar junto a gtwvw, pode usar somente o seguinte:

WVW_SetAltF4Close(.f.)

Antonio Carlos
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á

Saber se um executável está rodando..??

Mensagem por Pablo César »

Seja em modo console ou GUI, você pode utilizar este exemplo:

Código: Selecionar todos

REQUEST HB_GT_WIN_DEFAULT

Function Main ()
SetMode(25,80)
If IsExeRunning( cFileNoPath( HB_ArgV( 0 ) ) )
   Alert(HB_AnsiToOem("Execuçäo interrompida !;;Programa já esta sendo executado em outra sessäo !"))
   Quit
Endif
Cls
?
? "Este um exemplo de console rodando uma vez"
Inkey(0)
Return Nil

#pragma BEGINDUMP

#include <windows.h>

HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult
{
   HANDLE hMutex = CreateMutex( NULL, TRUE, ( LPTSTR ) hb_parc(1) );

   hb_retl( GetLastError() == ERROR_ALREADY_EXISTS );

   ReleaseMutex( hMutex );
}

#pragma ENDDUMP
O exemplo foi feito para HMG mas pode tranquilamente adaptado para qualquer ferramenta xBase. Pra quem quiser conferir, anexei o executável.
Anexos
So_Roda4.rar
(656.9 KiB) Baixado 258 vezes
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.
pauloa1
Usuário Nível 3
Usuário Nível 3
Mensagens: 227
Registrado em: 25 Jun 2008 14:57
Localização: Augusto Pestana-RS

Saber se um executável está rodando..??

Mensagem por pauloa1 »

Uso assim:

//logo no inicio

Código: Selecionar todos

if !empty(CreateMutex(.t.,nome_executavel()))
   if GetLastError() > 0
      beep()
      ALERT2("Atenção !!! O Sistema já está aberto...")  // program is already running
      quit
   endif
endif


***************************************************************************
function nome_executavel
   local C_EXE:=exename(),N_POS:=0
   N_POS:=rat("\",C_EXE)
 
   if N_POS > 0
      C_EXE:=substr(C_EXE,N_POS+1)
   endif
return (C_EXE)
 
#pragma BEGINDUMP

#include "hbapi.h"
#include <windows.h>
 
HB_FUNC( CREATEMUTEX )
{
     hb_retnl( ( ULONG ) CreateMutex( NULL, hb_parnl( 1 ), hb_parcx( 2 )
) );
 
}
 
HB_FUNC(GETLASTERROR)
{
   hb_retnl(GetLastError());
}
 
#pragma ENDDUMP
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Saber se um executável está rodando..??

Mensagem por asimoes »

Minha solução para verfificar se aplicação já está rodando.

Créditos ao Vailton pelo código da função WIN_GETPROCESSLIST()

Código: Selecionar todos

FUNCTION MAIN
   IF EstaRodando()
      Alert("Sistema ja esta  rodando. Saindo...")
      QUIT
   ENDIF
   ALERT("Estou rodando")
RETURN Nil


FUNCTION EstaRodando
LOCAL aProcs:={}, lEstaRodando:=.F., nVezes:=0, cExeName
cExeName:=SubStr(HB_ArgV(0), RAT(HB_PS(), HB_ArgV(0)) + 1 )
WIN_GETPROCESSLIST( aProcs, cExeName )
AEval( aProcs, {|x| nVezes++ } )
IF nVezes > 1
   lEstaRodando:=.T.
ENDIF
RETURN lEstaRodando

#pragma ENDDUMP

    #pragma BEGINDUMP
    #include <windows.h>
    #include <windef.h>
    #include <tlhelp32.h>
    #include <hbapi.h>
    #include <hbapiitm.h>

    static
    BOOL GetUserAndDomainFromPID( DWORD ProcessId, PHB_ITEM pUser, PHB_ITEM pDomain )
    {
      HANDLE hToken;
      HANDLE ProcessHandle;
      DWORD cbBuf;
      SID_NAME_USE snu;
      char *User = NULL;
      char *Domain = NULL;
      DWORD UserSize = 0L;
      DWORD DomainSize = 0L;
      BOOL bResult = FALSE;

      ProcessHandle = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, ProcessId );

      if (ProcessHandle)
      {
        if (OpenProcessToken(ProcessHandle, TOKEN_QUERY, &hToken))
        {
          BOOL bSuccess = FALSE;
          PTOKEN_USER ptiUser;
         
          if (!GetTokenInformation(hToken, TokenUser, NULL, 0, &cbBuf ))
          {
             ptiUser  = (TOKEN_USER *) hb_xgrab( cbBuf );
             bSuccess = GetTokenInformation( hToken, TokenUser, (LPVOID) ptiUser, cbBuf, &cbBuf);
          }

          CloseHandle(hToken);

          if (bSuccess)
          {
             LookupAccountSid( NULL, ptiUser->User.Sid, NULL, &UserSize, NULL, &DomainSize, &snu);

             if (UserSize != 0 && DomainSize != 0)
             {
               User   = (char *) hb_xgrab( UserSize );
               Domain = (char *) hb_xgrab( DomainSize );

               if (LookupAccountSid( NULL, ptiUser->User.Sid, User, &UserSize,
                                      Domain, &DomainSize, &snu))
               {
                /* Result OK */
                bResult = TRUE;
               }
             }
           }

          if (ptiUser)
             hb_xfree( ptiUser );
        }
        CloseHandle(ProcessHandle);
      }

      if (!User)
          hb_itemPutC( pUser, "" );
      else
          hb_itemPutCLPtr( pUser, User, UserSize );

      if (!Domain)
          hb_itemPutC( pDomain, "" );
      else
          hb_itemPutCLPtr( pDomain, Domain, DomainSize );

      return bResult;
    }

    /*
    * WIN_GETPROCESSLIST( aArray [, <cProcessToFind> ] ) -> nResult
    * Get current process list on Windows OS. by Vailton Renato <vailtom@gmail.com>
    *
    * Returns:
    *
    *  0 - Success
    *  1 - Argument error
    *  2 - Unable to obtain current process list.
    *  3 - Error retrieving information about processes.
    *
    * 15/12/2009 - 18:58:58
    */
    HB_FUNC( WIN_GETPROCESSLIST )
    {
      HANDLE hProcessSnap;
      PROCESSENTRY32 pe32;
      PHB_ITEM pArray = hb_param( 1, HB_IT_ARRAY );
      const char * szAppName = hb_parcx(2);
      BOOL bCanAdd = TRUE;

       if( !pArray )
       {
          hb_retni( 1 );
          return;
       }

      // Take a snapshot of all processes in the system.
      hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

      if( hProcessSnap == INVALID_HANDLE_VALUE )
      {
        // CreateToolhelp32Snapshot (of processes)
        hb_retni( 2 );
        return;
      }

      // Set the size of the structure before using it.
      pe32.dwSize = sizeof( PROCESSENTRY32 );

      // Retrieve information about the first process,
      // and exit if unsuccessful
      if( !Process32First( hProcessSnap, &pe32 ) )
      {
        hb_retni( 3 );
        CloseHandle( hProcessSnap );          // clean the snapshot object
        return;
      }

      // Ignores a empty string on seconds argument
      if ( hb_parclen(2) < 1 )
          szAppName = NULL;

      // Now walk the snapshot of processes, and
      // display information about each process in turn
      do
      {
        PHB_ITEM pSubarray;

        if (szAppName)
          bCanAdd = ( hb_stricmp( szAppName, pe32.szExeFile ) == 0 );

        if (bCanAdd)
        {
           pSubarray = hb_itemNew( NULL );

           hb_arrayNew( pSubarray, 5 );
           hb_arraySetC    ( pSubarray, 1, pe32.szExeFile );                    // Process Name
           hb_arraySetNInt ( pSubarray, 2, pe32.th32ProcessID );                // Process ID
           hb_arraySetNInt ( pSubarray, 3, pe32.th32ParentProcessID );          // Parent process ID

           GetUserAndDomainFromPID( pe32.th32ProcessID,
                                    hb_arrayGetItemPtr( pSubarray, 4 ),         // User
                                    hb_arrayGetItemPtr( pSubarray, 5 ) );       // Domain
           hb_arrayAddForward( pArray, pSubarray );
        }
      } while( Process32Next( hProcessSnap, &pe32 ) );

      CloseHandle( hProcessSnap );
      hb_retni( 0 );
      return;
    }

    /*
    * WIN_KILLPROCESS( <nProessIDtoKill> ) -> lKilled
    * Kill a process using Win32 API. by Vailton Renato <vailtom@gmail.com>
    * 16/12/2009 - 00:08:48
    */
    HB_FUNC( WIN_KILLPROCESS )
    {
       DWORD ProcID;
       BOOL Result = FALSE;

       if (HB_ISNUM(1))
       {
          ProcID = (DWORD) hb_parnl(1);
          Result = TerminateProcess(OpenProcess( PROCESS_TERMINATE, FALSE, ProcID ),0);
       }

       hb_retl( Result );
    }

    #pragma ENDDUMP
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
helio
Usuário Nível 3
Usuário Nível 3
Mensagens: 175
Registrado em: 04 Ago 2004 10:36
Localização: São Bento do Una-PE
Contato:

Como saber se o executavel ja estar em uso ?

Mensagem por helio »

Pessoal estou precisando saber se o sistemas ja estar sendo executado tem como ?
Helio Beltrao Jr.
msn: helio@htisistemas.com
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á

Como saber se o executavel ja estar em uso ?

Mensagem por Pablo César »

Hélio, faça antes uma pesquisa avançada aqui no fórum para saber se esse assunto já não foi tratado antes e evitar abrir um novo tópico. O seu tópico foi juntado com outro que trata do mesmo assunto, que já responde por si a sua questão. Ver mensagens acima.
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.
Responder