Program - uruchamialny tylko raz

mike512

Użytkownik
Dołączył
Styczeń 18, 2006
Posty
25
Napisałem jeden mały program w Dev C++ i chciałbym, żeby był on uruchamiany tylko raz, tzn. chciałbym, żeby w menadżerze zadań pozostał tylko jeden proces bez względu na to ile razy ktoś klikał na aplikację. Ktoś mi poradził, żebym zastosował jakieś "mutexy", ale koleś nie sprecyzował dokładnie o co mu chodzi. Będę wdzięczny za pomoc.
 

killrathi

Użytkownik
Dołączył
Marzec 13, 2006
Posty
117
przy uruchamianiu aplikacja niech sprawdza liste aktywnych procesow - jezeli znajdzie tam proces o nazwie jej odpowiadajacej to exit(0);
 

mike512

Użytkownik
Dołączył
Styczeń 18, 2006
Posty
25
Czy to będzie coś takiego?:

Kod:
HANDLE Mutex = CreateMutex (NULL, true, "SuperDuper");



//zamiast SuperDuper można wstawić inną nazwę :)



int nResult = GetLastError (); 



if (!nResult) 



{



//Nie wiem, co tu wstawić ;/ 



};
 

killrathi

Użytkownik
Dołączył
Marzec 13, 2006
Posty
117
nie widze sensu uzyawania mutexow w tym przypadku... Mutex sluzy to kontrolowania dostepu do zasobow wspoldzielonych takich jak min. sekcje krytyczne. W tym przypadku jest to zbedne bo nie chcesz wspoldzielic zasobow pomiedzy procesami a jedynie wykluczyc mozliwosc uruchomienia drugiego takiego samego procesu...
jak pisalem wczesniej - przy uruchomieniu, program niech wylistuje sobie aktywne procesy w systemie (sa do tego funkcji API) i sprawdzi czy odpowiadajacy mu istnieje - jezeli tak to wylacz drugi proces... Tak bedzie najlatwiej.
 

alder

Użytkownik
Dołączył
Marzec 10, 2006
Posty
5
mutex, semafor i tympodobne wyjatki jaknajbardziej tu pasuja;
Kod:
HANDLE Mutex = CreateMutex (NULL, true, "SuperDuper");

if (GetLastError() == ERROR_ALREADY_EXISTS)

{

   // uzyj EnumWindows() aby znalezc263; glowne okno uruchomionego programu

   // i daj mu fokus - SetForegroundWindow()

   CloseHandle(Mutex);

   return; // koniec programu

}



// jesli tu, to program jest jedyna uruchomiona kopia

// otwórz okno i dodaj mu cos unikalnego - np. tytul, property (SetProp)



// hwnd = CreateWindow();

// przykladowo ustawiam property

SetProp(hwnd, "unikalny string", 666); // 666 - dowolna liczba

szukac okna mozna tak:

Kod:
HWND hwndIstniejace = 0;

EnumWindows( (WNDENUMPROC)szukaj, (LPARAM)&hwndIstniejace );

if (hwndIstniejace)

{

   SetForegroundWindow(hwndIstniejace);

   CloseHandle(Mutex);

   return; // koniec programu

}

BOOL CALLBACK szukaj(HWND hwnd, LPARAM lParam)

{

  if (GetProp(hwnd, "unikalny string") == 666)

  {

     // jakies inne porównania? GetWindowText itd

     (HWND *)lParam = hwnd; return false;

  }

  return true;

}
 
Do góry Bottom