Saber se um executável está rodando..??
Moderador: Moderadores
-
Dércio_Luiz_Zanatta
- 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..??
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...
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...
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Buenas,
Em modo console puro eu uso um exemplo que foi postado pelo EOLO, bem simples:
Em aplicativos que uso a WHAT32.LIB ai uso o seguinte abaixo:
E por ultimo onde uso HWGUI, ai uso o seguinte abaixo, foi dica do MARCELOG:
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
Código: Selecionar todos
If (empty(CreateMutex( .T., strtran(GetModuleFileName(),"\",'_') )) .or. (GetLastError() > 0 ) )
MsgInfo("Sistema Já Aberto nessa Estação")
__Quit()
endif
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
xHarbour.org + Hwgui + PostgreSql
-
Dércio_Luiz_Zanatta
- Usuário Nível 3

- Mensagens: 153
- Registrado em: 11 Jan 2006 15:37
- Localização: Ibirubá - RS
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...
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...
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
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.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 ?
Veja se o link abaixo ajuda.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...
http://www.fivewin.com.br/forum/topic.asp?TOPIC_ID=9833
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
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!
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

- Mensagens: 400
- Registrado em: 25 Ago 2004 21:54
- Pablo César
- 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..??
Seja em modo console ou GUI, você pode utilizar este exemplo:
O exemplo foi feito para HMG mas pode tranquilamente adaptado para qualquer ferramenta xBase. Pra quem quiser conferir, anexei o executável.
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- 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.
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

- Mensagens: 227
- Registrado em: 25 Jun 2008 14:57
- Localização: Augusto Pestana-RS
Saber se um executável está rodando..??
Uso assim:
//logo no inicio
//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
Saber se um executável está rodando..??
Minha solução para verfificar se aplicação já está rodando.
Créditos ao Vailton pelo código da função WIN_GETPROCESSLIST()
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)
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)
- helio
- 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 ?
Pessoal estou precisando saber se o sistemas ja estar sendo executado tem como ?
Helio Beltrao Jr.
msn: helio@htisistemas.com
msn: helio@htisistemas.com
- Pablo César
- 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 ?
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.
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.

