Sprawdzanie, czy egzemplarz programu jest już uruchomiony Drukuj Email
Ocena użytkowników: / 1
SłabyŚwietny 
Wpisany przez Berl   
wtorek, 01 listopada 2005 15:30

Z pewnością każdy programista stanął przed problemem sprawdzenia, czy egzemplarz 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 operowania 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.

 

Statystyka

Użytkowników : 99
Artykułów : 76
Odsłon : 99787

Gościmy

Naszą witrynę przegląda teraz 2 gości 

Chmura tagów

delphi MySQL dziesiętny WHERE SendMessage Delphi rot-13 cezara binarny system forma WM_SYSCOMMAND ReleaseCapture SET windows szyfrowanie zamiana liczb FROM edytor zmienne