Dvě lišky najednou je příliš…

Také se vám stalo, že uživatel spustil vaši aplikaci dvakrát, třikrát či ještě vícekrát? Pokud ano, tak jistě víte, jaké problémy to přináší - najednou trvá všechno hrozně dlouho, soubory na lokálním disku, o kterých jste to nepředpokládali, se vám nedaří otevřít s volbou EXCLUSIVE, atd. Jak se této nepříjemnosti vyhnout? Snadno! Na začátku programu zavoláte funkci FirstInstance(), které jako parametr předáte „jméno semaforu “. Pokud ještě tento semafor neexistuje, funkce vrátí .T., semafor je vytvořen a aplikace spuštěna. Pokud se ale uživatel pokusí spustit aplikaci na stejném počítači ještě jednou, funkce FirstInstance vrátí hodnotu .F. (protože semafor již existuje) a aplikace se nespustí.

IF !FirstInstance("Pokus")
   =MessageBox("Pokoušíte se spustit tuto aplikaci po druhé."+CHR(13)+;
   "Končím...",0+16,"CHYBA")
   QUIT && Nebo něco podobného
ENDIF

FUNCTION FirstInstance(pMutex)
   #DEFINE ERROR_ALREADY_EXISTS 183
   DECLARE INTEGER CreateMutex IN WIN32API INTEGER, INTEGER, STRING @
   DECLARE INTEGER CloseHandle IN WIN32API INTEGER
   DECLARE INTEGER GetLastError IN WIN32API

   nExeHwnd=CreateMutex(0,1,@pMutex)
   IF GetLastError()=ERROR_ALREADY_EXISTS
      =CloseHandle(nExeHwnd)
      RETURN .F.
   ELSE
      RETURN .T.
   ENDIF
ENDFUNC

Uveďme ještě několik poznámek k funkci FirstInstance() :
Při libovolném skončení aplikace (třeba i přes TaskManager) se semafor automaticky zruší, takže se nemusíte nijak starat o to, aby šlo aplikaci znovu spustit.

Pomocí funkce FirstInstance() lze nejenom zabránit spuštění jedné aplikace vícekrát, ale třeba i spuštění jednoho formuláře uvnitř vašeho programu - představivosti se meze nekladou.

Jména funkcí v příkazu DECLARE musí být napsána přesně tak, jak jsou uvedena ve WIN32API - záleží na malých a velkých písmenech.

A to je vše. Zdraví vás
Milan Kosina, kosina@vol.cz