Newsgroup: it.comp.lang.delphi
Titolo: Programma gia' in esecuzione

 esiste un modo per sapere se un dato programma e' gia' in esecuzione.
Ma vuoi sapere se un generico programma X e' in esecuzione (tanto per dire,
eudora), o vuoi sapere se un'altra istanza del tuo programma e' in
esecuzione ?

Ben consapevole che l'argomento e' gia' trattato, chiedo umilmente per
l'ennesima volta, visto che non trovo una risposta precisa alla domanda, se
esiste un modo per sapere se un dato programma e' gia' in esecuzione.
Dovrei realizzare una funzione del genere: if not ProgramIsRunning then
RunProgram.
Ho consultato google in italiano, in inglese, sui newsgroups... ma il
problema e' che ci sono TROPPE informazioni, e non ho una chiave per trovare
esattamente quello che mi serve. La maggior parte delle risposte riguardano
i Mutex, e quindi sono utili solo se voglio controllare che *lo stesso
programma* sia in esecuzione... Quindi vi chiedo questa gentilezza: se
qualcuno sa la risposta, e ci mette 2 minuti a scriverla, mi evita di
cercarla per un'altra mezz'ora... Grazie.

 esecuzione ?
La prima che hai detto.
L'unica risposta che ho trovato al momento e': "dipende, e' una funzione
diversa se usi Windows 95/98 oppure NT/2000". Solo che non dice quale sia
l'una e quale l'altra... :-(

 scriveva fra l'altro:
JCL 1.2 (v. su Sourceforge)
offrono  le funzioni:
function GetPidFromProcessName(const ProcessName: string): DWORD;
*Parameters*
const ProcessName: string
Name of the process, including extension, of the process for which to
retrieve the process identifier.
es:
if (GetPidFromProcessName('DELPHI32.EXE') <> INVALID_HANDLE_VALUE) then
  ShowMessage('Delphi e'' attivo');
e
Returns a list of all running processes.
function RunningProcessesList(const List: TStrings; FullPath: Boolean =
True): Boolean;
Unit
JclSysInfo
senno' vedi sotto (un adattamento di una di quelle sopra)
Saluti
Paolo Arosio
--
function PIDFromName(ProcName: string;
  var PID: DWORD): boolean;
var PIDs: array[0..1024] of DWORD;
    Needed, i: DWORD;
    hProc: THandle;
    curProcName: string;
begin
  Result := False;
  ProcName := ChangeFileExt(ProcName, '.exe');
  if not EnumProcesses(@PIDs, SizeOf(PIDs), Needed) then
    Exit;
  for i := 0 to (Needed div Sizeof(DWORD)) - 1 do begin
    PID := PIDs[i];
    hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
False, PID);
    if hProc <> 0 then try
      SetLength(curProcName, MAX_PATH);
      if GetModuleBaseNameA(hProc, 0, PChar(curProcName), MAX_PATH) > 0
then begin
        SetLength(curProcName, StrLen(PChar(curProcName)));
        Result := AnsiCompareFileName(curProcName, ProcName) = 0;
        if Result then
          Break;
      end;
    finally
      CloseHandle(hProc);
    end;
  end;
end;

   if not EnumProcesses(@PIDs, SizeOf(PIDs), Needed) then
Ehm... dove l'hai presa la EnumProcesses? In quale strana unit di Delphi la
posso trovare? Qui ho solo EnumWindows...

 posso trovare? Qui ho solo EnumWindows...
E, per inciso, nemmeno EnumWindows fa quello che pensavo...
:(

 ha scritto nel messaggio
news:b6hc10$f7f$1...@newsreader.mailgate.org...

io uso questa funzione
if Findwindow(pchar('applicationclass'),nil)=0 then ...
dove al posto di applicationclass metto ovviamente il nome della
applicazione che devo controllare.
Funziona anche con i servizi.
Ciao, Roberto

> Delphi la posso trovare? Qui ho solo EnumWindows...
Suppongo sia in psapi, dato che la funzione e' stata scritta per NT
(altrimenti e' quell'altra di cui non ricordo il nome).
Saluti
Paolo Arosio

 (altrimenti e' quell'altra di cui non ricordo il nome).
Non la trovo nemmeno nell'help, ma ora non serve piu'. Grazie.