[ FranjoZG @ 09.11.2021. 11:58 ] @
Delphi 2007

Stanka koristi više instanci programa. Moram znati kada se pokreće prva i kada se zatvara posljednja.

Kada se pokreće prva instanca porgama sam riješio, ne uspjeva mi naći način kako otkriti da je to posljednja instanca koja se zatvara.
Ako provjeravam da li je program pokrenut - je, jer je to zadnji i još nije zatvoren.

Postoji li način kako otkriti koliko je instanci programa pokrenuto?
[ savkic @ 09.11.2021. 15:39 ] @
Proveravas iz samog programa ili iz nekog drugog?
Par ideja:
- Mozes da koristis zajednicku memoriju (memory mapped files) iz vise procesa pa da uvecas i smanjujes brojac kako se program startuje.
- Koristi jobove, CreateJobObject/OpenJobObject, AssignProcessToJobObject, QueryInformationJobObject. Svaki startovani proces uzme koristi isti job (jedinstven naziv) i doda samog sebe u job.

[ Predrag Supurovic @ 10.11.2021. 01:34 ] @
DAvno sam radio sa tim, ali koliko se sećam niej bio problem da iz svoej aliakciej pristupiš svim aktivnim apliakcijama i pobrojiš ih. To se običnokorsiti da onemogućiš da se ista apliakciaj pokrene dva ili više puta, ali ne vidim što ne bi i tebli poslužilo.

Na brzinu iskopah ovo: http://www.delphidabbler.com/articles/article-13

Dakle prosto pobrojiš apliakcije koje imaju isti windwosclass i ako ima samo jedna onda je to to.
[ FranjoZG @ 10.11.2021. 08:51 ] @
Hvala na pomoći. Našao sam rješenje - fun. koja vraća broj pokrenutih instanci programa. Pa ako kome zatreba...
Code:


uses ... , tlHelp32;


function TForm1.CheckProcessCount(const ExeName: String): Integer;
var
   NextProcessLoop: BOOL;
   FHandle: THandle;
   FProcessEntry32: TProcessEntry32;
   fExeName: string;
begin
   if ExeName <> '' then fExeName := ExtractFileName(ExeName)
   else fExeName := ExtractFileName(Application.ExeName);
   
   FHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
   NextProcessLoop := Process32First(FHandle, FProcessEntry32);
   Result := 0;

   while Integer(NextProcessLoop) <> 0 do
   begin
      if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(fExeName)) or
      (UpperCase(FProcessEntry32.szExeFile) =UpperCase(fExeName))) then Inc(Result);
      NextProcessLoop := Process32Next(FHandle, FProcessEntry32);
   end;
   CloseHandle(FHandle);
end;