www.mamboteam.com
Project1.pl Advertisement
Start arrow Artykuły arrow Praktyczne wykorzystanie Delphi arrow Sprawdzanie, czy egzemplarz programu jest już uruchomiony
piątek, 12 marzec 2010
 
 
Menu główne
Start
Artykuły
FAQ
Download
Kontakt
Ciekawe linki
Forum
Mapa serwisu
Logowanie





Zapomniałeś hasła?
Nie masz konta? Załóż sobie
Sprawdzanie, czy egzemplarz programu jest już uruchomiony Drukuj E-mail
Oceny: / 0
KiepskiBardzo dobry 
Napisał: Berl   
wtorek, 01 listopad 2005
Z pewnością każdy programista stanął przed problemem sprawdzenia, czy egzeplarz jego programu jest już uruchomiony. Można tego dokonać na wiele sposobów, mniej lub bardziej profesjonalnych, w tym artykule zajmiemy się opisaniem dwóch z nich.





1. Zastosowanie funkcji FindWindow
Funkcja FindWindow z modułu Windows służy do znajdowania uchwytu okna. Argumentami funkcji FindWindow są wskaźniki do klasy oraz nazwy okna. Podanie któregoś argumentu jako nil powoduje, że albo klasa, albo nazwa szukanego okna są dowolne.

Pzykłady :
FindWindow('TForm1', 'Form1')
- zwraca uchwyt do okna klasy TForm1 o nazwie Form1;
FindWindow('TForm1', nil)
- zwraca uchwyt do okna klasy TForm1 o dowolnej nazwie;
FindWindow(nil, 'Form1')
- zwraca uchwyt do okna o nazwie Form1 i dowolnej klasie;
FindWindow('TForm1', '')
- zwraca uchwyt do okna klasy TForm1, które nie posiada nazwy;

Wynik zwracany przez funkcję FindWindow jest typu HWND. Jest to typ zgodny z THandle, więc można uzywać ich zamiennie.

Jeżeli wynik działania funkcji jest równy 0, oznacza to, że nie znaleziono okna o podanych parametrach.

Przykład zastosowania tego sposobu :
var     uchwyt : HWND;
 begin
     uchwyt := FindWindow('TForm1', 'Fom1');
     if Uchwyt  0 then begin
         ShowMessage('Egzemplarz programu jest już uruchomiony');
     end;
 end;
UWAGA! Jeśli program z takim kodem uruchomimy w środowisku Delphi, to program nie zostanie uruchomiony ani razu, gdyż okno takiej klasy i o takiej nazwie jak będziemy szukać jest już otwarty na etapie projektowania.

2. Wykorzystanie muteksu
Muteks jest to obiekt, który w środowisku Windows nie może się powtarzać - może istnieć jeden muteks o danej nazwie.

Na początku działania programu tworzymy muteks o danej nazwie, za pomocą funkcji CreateMutex. Jej argumenty to :

LPSECURITY_ATTRIBUTES lpMutexAttributes - określa, czy identyfikator muteksu może być dziedziczony przez procesy potomne. Jeśli ma wartość nil, to nie może być dziedziczony
BOOL bInitialOwner - Parametr ten określa, czy program wywołujący funkcję staje się właścicielem muteksu
LPCTSTR lpName - określa nazwę muteksu

Funkcja CreateMutex jako wynik zwraca typ THandle.

Aby sprawdzić, czy muteks o danej nazwie już istnieje, należy posłużyć się funkcją WaitForSingleObject. Jej argumenty to :

HANDLE hHandle - identyfikator muteksu, który chcemy sprawdzić
DWORD dwMilliseconds - czas, jaki musi upłynąć, zanim funkcja zwróci wynik.
Wynikiem działania funkcji jest liczba typu DWORD. Dla łatwiejszego oprowania tym wynikiem system wykorzystuje stałe, których nazwa zaczyna się od przedrostka "wait_". W tym przypadku interesuje nas wait_TimeOut. W przypadku muteksu wynik ten oznacza, że muteks o danej nazwie już istnieje.

Przykład zastosowania tego sposobu :
var
     Muteks : THandle;
 begin
     Muteks := CreateMutex(nil, False, 'Nazwa');
     if WaitForSingleObject(Muteks, 0) = wait_TimeOut then
         ShowMessage('Egzemplarz programu jest już uruchomiony');
 end;
W artykule tym zostały omówione najprostsze, a zarazem najskuteczniejsze metody wykrywania, czy program jest już uruchomiony.
Komentarze

Aby dodać komentarz zaloguj się. Jeśli nie masz konta, załóż je sobie.
Tylko zarejestrowani użytkownicy mogą pisać komentarze.

 
wstecz   dalej »
LINKUJ PRO
Gościmy
Odwiedza nas 17 gości
Licznik odwiedzin
87146
 
Góra Góra