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