Newsgroup: it.comp.lang.delphi
Titolo: Chiudere Un Processo In Esecuzione

Il problema è il seguente:
devo realizzare un programma che analizzi l'elenco dei programmi in
esecuzione e chiuda quello che cerco io.
ho una procedura che chiude i processi in base all'id.
Ma cosa cerco io in esecuzione ?
è un'applicazione che sta solo nel system tray, niente nome di finestra, se
faccio ctrl-alt-canc mi dà nella lista il nome dell'eseguibile senza exe, se
uso programmi + specifici come process explorer, mi dà nome dell'eseguibile
e id.
ovviamente l'id cambia ad ogni lancio, quindi sulla base del nome
dell'eseguibile devo individuarlo e chiuderlo. (quindi devo ottenerne l'id)
potete aiutarmi ?
non ho un help valido di delphi, quindi se potete aiutarmi un bel po' sulla
sintassi di tutta la funzione ve ne sarei grato :)

Io uso questo per la lista dei processi in esecuzione:
file://*********************************************************************
************
Uses
  Psapi, tlhelp32;
procedure CreateWin9xProcessList(List : TStringList) ;
var
  hSnapShot : THandle;
  ProcInfo : TProcessEntry32;
begin
  if List = nil then Exit ;
  hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapShot <> THandle(-1)) then
  begin
    ProcInfo.dwSize := sizeof(ProcInfo) ;
    if (Process32First(hSnapshot, ProcInfo)) then
    begin
     List.Add( ProcInfo.szExeFile) ;
     while (Process32Next(hSnapShot, ProcInfo)) do
      List.Add(ProcInfo.szExeFile) ;
    end ;
    CloseHandle(hSnapShot) ;
  end ;
end ;
procedure CreateWinNTProcessList(List : 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
  if List = nil then Exit ;
  EnumProcesses(@PIDArray, sizeof(PIDArray), cb) ;
  ProcCount := cb div sizeof(DWORD) ;
  for I := 0 to ProcCount-1 do
  begin
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
    PROCESS_VM_READ,
    false,
    PIDArray[I]) ;
    if (hProcess <> 0) then
    begin
      EnumProcessModules(hProcess, @hMod, sizeof(hMod), cb) ;
      GetModuleFilenameEx(hProcess,hMod,ModuleName,sizeof(ModuleName));
      List.Add(ModuleName);
      CloseHandle(hProcess);
    end;
  end;
end;
procedure GetProcessList(Var List : TStringList) ;
var ovi : TOSVersionInfo ;
begin
  if List = nil then Exit ;
  ovi.dwOSVersionInfoSize := sizeof(TOSVersionInfo) ;
  GetVersionEx(ovi) ;
  case ovi.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS : CreateWin9xProcessList(List) ;
    VER_PLATFORM_WIN32_NT : CreateWinNTProcessList(List) ;
  end
end;
function EXE_Running(FileName : String; fullpath : boolean) : boolean;
var
  i : integer ;
  MyProcList : TStringList;
begin
 MyProcList := TStringList.Create;
 try
   GetProcessList(MyProcList) ;
   result := false;
   if MyProcList = nil then Exit;
    for i := 0 to MyProcList.Count - 1 do
    begin
      if not fullpath then
      begin
       if CompareText(ExtractFileName(MyProcList.Strings[i]),FileName) = 0
then result := true
      end else
       if CompareText(MyProcList.Strings[i],FileName) = 0 then result :=
true;
     if result then break;
    end;
  finally
   MyProcList.Free ;
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer ;
  MyProcList : TStringList;
begin
 MyProcList := TStringList.Create;
 try
   GetProcessList(MyProcList) ;
   if MyProcList = nil then Exit;
    for i := 0 to MyProcList.Count - 1 do
      ListBox1.items.add(MyProcList.Strings[i]);
 finally
   MyProcList.Free;
 end;
end;
file://*********************************************************************
************
...e questo per chiuderne uno:
file://*********************************************************************
************
function KillTask(ExeFileName: string): integer;
const
  PROCESS_TERMINATE=$0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot
                     (TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
                                 FProcessEntry32);
  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase(ExeFileName))
     or (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase(ExeFileName))) then
      Result :=
eger(TerminateProcess(OpenProcess( 
                        PROCESS_TERMINATE, BOOL(0), 
                        FProcessEntry32.th32ProcessID), 0)); 
    ContinueLoop 
:= Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  KillTask(<Nome del processo>);
// il nome del processo lo puoi ricavare dalla lista dei processi creata
precedentemente
end;
file://*********************************************************************
************
-=Mela=- <REMOVE...@ngi.itREMOVEME> wrote in message
a15evd$v0r$1...@news.ngi.it...
