Newsgroup: it.comp.lang.delphi
Titolo: Sapere se un programma è in esecuzione

Come si fa a sapere, dall'interno di un'applicazione, se un dato programma è in
esecuzione o no ?
Grazie in anticipo


ciao,
puoi procedere così:
HWND HMutex;
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  // Crea un oggetto mutex con nome; deve essere unico.
  // una seconda chiamata alla funzione creerà solo un
  // puntatore al mutex
  HMutex = CreateMutex(NULL, false, "IstanzaUnica");
  // Controlla se il mutex è libero
  if (WaitForSingleObject(HMutex, 0) != WAIT_TIMEOUT) {
    try
    {
       Application->Initialize();
       Application->CreateForm(__classid(La Form principale), &frmLa Form
principale);
       Application->Run();
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
    }
  } // dato che il programma non rilascia il mutex durante
    // l'esecuzione, potrà girare una sola istanza del programma
  else MessageDlg("Il programma è già in esecuzione",
                  mtInformation, TMsgDlgButtons() << mbOK, 0);
  return 0;
}
--
e-mail : 
dm...@usa.net
ICQ# 62122231

 wrote in message 8su7u9$etv$1...@nslave2.tin.it...


 Fare anche un ReleaseMutex ? Ciao !
..e scrivere in pascal? ;)
seriamente, funziona anche senza fare il releasemutex (o closehandle),
perche'?

 perche'?
E' un po' come istanziare memoria per un oggetto di tipo TClasse e poi non
richiamare il suo metodo Free ... funziona, però il sistema "marchia" come
occupata la memoria e questa non potrà essere utilizzata da altre
applicazioni ... Morale: è sempre meglio liberare la memoria!
La CloseHandle chiude Handle aperto da certi oggetti ... questa riga
dell'SDK sintetizza benissimo il suo scopo :
CloseHandle invalidates the specified object handle, decrements the object's
handle count, and performs object retention checks. Once the last handle to
an object is closed, the object is removed from the operating system.
Ciao!
--
- Carlo -

> > ..e scrivere in pascal? ;)
Scusate ma ultimamente sto usando il BCB e mi viene spontaneo usare la
sintassi C++.

Credevo che  windows marcasse i mutex come appartenenti al processo che li
ha settati, e quindi alla chiusura del processo "proprietario" anche il
mutex venisse cancellato. Forse quando termina il processo proprietario il
SO li setta semplicemente come non segnalati? Lo chiedo perchè avviando il
prg. che setta il mutex, chiudendolo e avviandolo di nuovo funziona
regolarmente.
ciao




Scusate, mi va benissimo il C++, ma io non volevo un controllo per avere una
singola istanza, bensì volevo che la mia applicazione si accorgesse se una
diversa applicazione sta girando o no. E' possibile ?
Grazie

diversa applicazione sta girando o no. E' possibile ?
Puoi scorrere la lista dei processi ed accertarti che il nome
dell'eseguibile sia tra essi. Oppure, se il processo possiede
finestre, puoi usare FindWindow.

 se una diversa applicazione sta girando o no. E' possibile ?
se l'altra applicazione l'hai fatta tu allora potresti usare
cmq i mutex, oppure penso si possa usare l'API FindWindow...
Ciao,
Alan Solo

 da altre applicazioni ... Morale: è sempre meglio liberare la memoria!
si' lo so, ed e' proprio per questo motivo per cui mi stupisce il fatto
che tutto funzioni,
nel caso di un oggetto istanziato e non liberato cio' che puo' succedere
e' "esaurire" la ram, ma nel caso di un mutex, come mai chiudendo
l'applicazione e riaprendola, il mutex, anche se non esplicitamente
liberato, non c'e' piu'?
O viene associato al processo, o il compilatore e' talmente bravo che fa
per noi questo lavoro.. boh?!? :)
beh, come hai detto tu e' sempre meglio liberare esplicitamente la
memoria, pero' non capisco...
Ciao!
Alan Solo

per noi questo lavoro.. boh?!? :)
Dipende da Windows. Non e' necessario forzare con ReleaseMutex.
Questo si dovrebbe fare all'interno dell'applicazione, se e'
necessario sincronizzare i thread. Come Jeffrey Richter insegna, gli
oggetti kernel (esclusi un paio) appartengono al processo e quindi
quando esso non esiste piu', vengono automaticamente rilasciati.

 memoria, pero' non capisco...
Spero che ora sia + chiaro!


 creati, quindi il SO li termina assieme al processo.
ok, questo volevo sapere con certezza,
grazie anche ad Andrea per la conferma
Ciao,
Alan Solo