CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Blokowanie ponownego uruchomienia działającej aplikacji.
Strona 1 z 1

Blokowanie ponownego uruchomienia działającej aplikacji.

Nowy postNapisane: poniedziałek, 9 lipca 2018, 15:29
przez Proton
Witam.

Środowisko C++ XE Berlin 10.1 szukam najlepszej metody zabezpieczenia przed ponownym uruchomieniem działającej już aplikacji.
Rozwiązanie które stosowałem z C++ Buildera 5 nie działa.

Do tej pory stosowałem mechanizm :
HANDLE Mutex = OpenMutex(MUTEX_ALL_ACCESS, false, "TylkoJedenEgzemplarz") ... itd

Próba ponownego uruchomienia działającej aplikacji powodowała wywołanie okna już działającej.

Będę wdzięczny za pomoc.

Ed.

Re: Blokowanie ponownego uruchomienia działającej aplikacji.

Nowy postNapisane: wtorek, 10 lipca 2018, 10:01
przez Mironas
Inny sposób masz tutaj:
http://programowanie.cal.pl/cyfbar/api2.html#api27

A ja zmieniam nazwę głównego okna z Form1 na niepowtarzalną, np Form_1XXABC a potem, w pliku CPP projektu (np Project1.cpp) dopisuję coś takiego:
KOD cpp:     UKRYJ  
// W pliku CPP projektu w funkcji 'WINAPI _tWinMain':
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
  // Blokada uruchomienia kopii programu
  HWND wnd = FindWindow(L"TForm_1XXABC", NULL);
  if ( wnd )
  {
    SendMessage(wnd, WM_SYSCOMMAND, SC_RESTORE, 0);
    SetForegroundWindow(wnd);
    Application->Terminate();
  }

  // Normalne uruchomienie programu
  else
  {
    ....
 


Dodatkowo (nie jest to konieczne, ale wolę stosować w innych oknach nazwę Form1), na końcu pliku nagłówkowego głównego okna (Form_1XXABC.h), pomiędzy extern PACKAGE a ostatnim #endif dodaję taki fragment:
KOD cpp:     UKRYJ  
extern PACKAGE TForm_1Cryptext *Form_1XXABC;
//---------------------------------------------------------------------------
#ifndef Form1
#define Form1 Form_1XXABC
#endif
//---------------------------------------------------------------------------
#endif
 

Re: Blokowanie ponownego uruchomienia działającej aplikacji.

Nowy postNapisane: wtorek, 10 lipca 2018, 10:39
przez polymorphism
Rozwiązanie z mutexem jest dobre, tylko musisz je dać w funkcji WinMain, przed stworzeniem okna głównego.

Re: Blokowanie ponownego uruchomienia działającej aplikacji.

Nowy postNapisane: czwartek, 12 lipca 2018, 08:47
przez Proton
Witam jeszcze raz.

Jednak mechanizm :
HANDLE Mutex = OpenMutex(MUTEX_ALL_ACCESS, false, "TylkoJedenEgzemplarz") ... itd

działa, namieszałem podczas przenoszenia kodu do nowego środowiska ze środowiska C++ Builder 5.0.

Próba ponownego uruchomienia działającej aplikacji powoduje wywołanie okna już działającej.

Jeśli będzie zainteresowanie to przedstawię mechanizm dla środowiska C++ XE Berlin 10.1.

Dzięki za zainteresowanie tematem.

Ed.