Jak uniemożliwić uruchomienie dwóch kopii programu ?
Czasami chcemy zabronić drugi raz na uruchamianie tego samego programu. Mozemy zastosowac rożne sztuczki :
- Pliki tymczasowe
- Rejestry
- Pliki konfiguracyjne *.ini
Metody te mają jedną zasadniczą wade... Co jeśli komputer się zawiesi i program nie zakończy swojego działania poprawnie (tj. nie usunie pliku tymczasowego, nie zmodyfikuje rejestru, nie dokona zmian w pliku ini) ... niestety nie uruchomimy programu, aż do momentu usunięcia niedogodności ręcznie!
Jest za to mechanizm który możemy wykorzystać i który nie zawiera tych niedogodności... są nimi Mutexy. Pomimo, że mutexy wykorzystywane są w innych celach ich mechanizm świetnie realizuje nasz problem.
W pliku Project1.cpp (domyślny plik projektu w C++Builderze) wystarczy dodać cztery linijki i problem rozwiązany.
- Pliki tymczasowe
- Rejestry
- Pliki konfiguracyjne *.ini
Metody te mają jedną zasadniczą wade... Co jeśli komputer się zawiesi i program nie zakończy swojego działania poprawnie (tj. nie usunie pliku tymczasowego, nie zmodyfikuje rejestru, nie dokona zmian w pliku ini) ... niestety nie uruchomimy programu, aż do momentu usunięcia niedogodności ręcznie!
Jest za to mechanizm który możemy wykorzystać i który nie zawiera tych niedogodności... są nimi Mutexy. Pomimo, że mutexy wykorzystywane są w innych celach ich mechanizm świetnie realizuje nasz problem.
W pliku Project1.cpp (domyślny plik projektu w C++Builderze) wystarczy dodać cztery linijki i problem rozwiązany.
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
/*1*/ CreateMutex(NULL, TRUE, "CREATE_MUTEX_TEST");
/*2*/ if (GetLastError() == ERROR_ALREADY_EXISTS)
/*3*/ MessageBox(NULL, "Precz mi z oczu!", "Error" , MB_OK);
/*4*/ else
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
/*1*/ CreateMutex(NULL, TRUE, "CREATE_MUTEX_TEST");
/*2*/ if (GetLastError() == ERROR_ALREADY_EXISTS)
/*3*/ MessageBox(NULL, "Precz mi z oczu!", "Error" , MB_OK);
/*4*/ else
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
Autorem tekstu jest:
Wojciech Bojewski
Materiał dodany przez użytkownika: _hador_
