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

Ciao,
ho fatto un piccolo programma che prima di fare certe operazioni lancia
delle applicazioni esterne con la ShellExecute; il mio problema è rilevare
se queste applicazioni sono già in esecuzione per evitare di lanciarle
nuovamente.
Grazie a tutti.
Ciao.
--
DeViL!
=====================================
Togliere ILDISTURBO per rispondere :-)
=====================================
--------------------------------------------------------
"in tutti i tipi di unione, ciascuno dovrebbe comportarsi
secondo la sua naturale inclinazione" (Vatsayana)
--------------------------------------------------------

 nuovamente.
Dovresti specificare il SO...
Cmq se n'era già parlato su 
news.marcocantu.it
 (dovrai iscriverti se non sei
già iscritto, è gratuito) nel NG libero.delphi.winapi nel thread
"Informazioni sui moduli caricati" aperto da Nando Dessena il 12/05/2000...
Ciao :-)
--
Andrea Magni
E-Mail: 
ama...@interac.it

nuovamente.
Dipende se programmi sotto Windows9x o NT.
In entrambi i casi, la tecnica da seguire e' quella di ottenere una
lista di processi in esecuzione e verificare che il processo da
lanciare non sia tra essi.
Ti ho scritto la seguente applicazione che funziona sotto entrambi gli
ambienti :
program ListaProcessi ;
{(C)2000 Andrea Laforgia}
{$APPTYPE CONSOLE}
uses SysUtils, Windows, TLHelp32, Psapi, Classes ;
function CreateWin9xProcessList : TStringList ;
var hSnapShot : THandle ;
    ProcInfo  : TProcessEntry32 ;
begin
  Result := TStringList.Create() ;
  // facciamo una foto al sistema
  // cogliendo la lista dei processi...
  hSnapShot := CreateToolHelp32Snapshot( TH32CS_SNAPPROCESS, 0 ) ;
  // se la foto riesce e...
  if ( hSnapShot <> THandle(-1) ) then
  begin
    ProcInfo.dwSize := sizeof( ProcInfo ) ;
    // ...se troviamo almeno un processo...
    if ( Process32First( hSnapshot, ProcInfo ) ) then
    begin
      // ...ne salviamo il nome dell'eseguibile associato...
      Result.Add( ProcInfo.szExeFile ) ;
      // continuiamo la ricerca...
      while ( Process32Next( hSnapShot, ProcInfo ) ) do
        Result.Add( ProcInfo.szExeFile ) ;
    end ;
    // rilasciamo l'handle dello snapshot
    CloseHandle( hSnapShot ) ;
  end ;
end ;
function CreateWinNTProcessList : TStringList ;
var PIDArray   : array [0..1023] of DWORD ;
    cb         : DWORD ;
    I          : integer ;
    ProcCount  : integer ;
    hMod       : HMODULE ;
    hProcess   : THandle ;
    ModuleName : array [0..300] of char ;
begin
  Result := TStringList.Create() ;
  // elenco dei PID di ogni processo nel nostro array
  EnumProcesses( @PIDArray, sizeof( PIDArray ), cb ) ;
  // calcoliamo il numero di processi trovati
  ProcCount := cb div sizeof( DWORD ) ;
  // troviamo il nome del modulo legato ad ogni processo
  for I := 0 to ProcCount-1 do
  begin
    // innanzitutto interroghiamo il processo
    hProcess := OpenProcess( PROCESS_QUERY_INFORMATION or
                             PROCESS_VM_READ,
                             false,
                             PIDArray[I] ) ;
    // se ci risponde
    if ( hProcess <> 0 ) then
    begin
      // otteniamo l'handle del modulo ad esso associato e...
      EnumProcessModules( hProcess, @hMod, sizeof( hMod ), cb ) ;
      // ...ne ricaviamo il nome dell'eseguibile
      GetModuleBaseName( hProcess,
                         hMod, ModuleName, sizeof( ModuleName ) ) ;
      // lo aggiungiamo alla nostra lista e...
      Result.Add( ModuleName ) ;
      // ...rilasciamo l'handle del processo aperto
      CloseHandle( hProcess ) ;
    end ;
  end ;
end ;
function GetProcessList : TStringList ;
var ovi : TOSVersionInfo ;
begin
  Result := nil ;
  ovi.dwOSVersionInfoSize := sizeof( TOSVersionInfo ) ;
  GetVersionEx( ovi ) ;
  case ovi.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS : Result := CreateWin9xProcessList ;
    VER_PLATFORM_WIN32_NT      : Result := CreateWinNTProcessList ;
  end
end ;
procedure WriteProcessList( L : TStringList ) ;
var I : integer ;
begin
  for I := 0 to L.Count - 1 do
    writeln( L.Strings[I] ) ;
end ;
// main program
var MiaListaProcessi : TStringList ;
begin
  MiaListaProcessi := GetProcessList ;
  WriteProcessList( MiaListaProcessi ) ;
  MiaListaProcessi.Free ;
  readln ;
end.
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
-----------------------------------------------------
"There is nothing better for understanding a kangaroo
 than seeing it jump." [D.Grune, C.J.H. Jacobs]
-----------------------------------------------------




Potresti adoperare anche CreateMutex....
CreateMutex va bene solo quando e' la propria applicazione a testare
la propria presenza o meno.


Potresti adoperare anche CreateMutex....
???
E cosa ottieni? Non si tratta  di evitare che la propria applicazione sia
aperta 2 volte....
Ciao
--
- Carlo -