| Sprawdzanie, czy egzemplarz programu jest już uruchomiony |
|
|
| 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 : varMuteks : 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.
Aby dodać komentarz zaloguj się. Jeśli nie masz konta, załóż je sobie. |
||
| wstecz | dalej » |
|---|




