c ++ - Sådan kører du kun en forekomst af applikationen

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en applikation, der bruger socketforbindelse til at sende og modtage data fra en anden applikation. Under oprettelse af stikkontakt bruger den port 4998.


Det er her mit problem ligger. Når jeg starter mit program, starter stikkontakten med port 4998. Så hvis jeg vil udføre programmet igen, så får jeg fat i socket-bindingsfejl.


Så jeg vil begrænse min applikationsinstans til en. Det betyder, at hvis applikationen allerede kører, og en af ​​dem forsøger at køre programmet igen ved at klikke på exe eller genvejsikonet, skal det ikke køre programmet. I stedet skal det medbringe det eksisterende program til toppen.

Bedste reference


Du må måske bruge navnet mutex.


Kodeeksempel fra artiklen: [7]


WINAPI WinMain(
  HINSTANCE, HINSTANCE, LPSTR, int)
{
  try {
    // Try to open the mutex.
    HANDLE hMutex = OpenMutex(
      MUTEX\_ALL\_ACCESS, 0, "MyApp1.0");

    if (!hMutex)
      // Mutex doesn’t exist. This is
      // the first instance so create
      // the mutex.
      hMutex = 
        CreateMutex(0, 0, "MyApp1.0");
    else
      // The mutex exists so this is the
      // the second instance so return.
      return 0;

    Application->Initialize();
    Application->CreateForm(
      \_\_classid(TForm1), &Form1);
    Application->Run();

    // The app is closing so release
    // the mutex.
    ReleaseMutex(hMutex);
  }
  catch (Exception &exception) {
    Application->
      ShowException(&exception);
  }
  return 0;
}

Andre referencer 1


/*
Jeg har fundet den nødvendige redigering til at ske. Tilføjet nogle ekstra kode og redigeringer, der er nødvendige. Den nuværende arbejder perfekt for mig. Tak, Kirill V. Lyadvinsky og Remy Lebeau for hjælp !!


*/


bool CheckOneInstance()
{

    HANDLE  m\_hStartEvent = CreateEventW( NULL, FALSE, FALSE, L"Global\CSAPP" );

    if(m\_hStartEvent == NULL)
    {
    CloseHandle( m\_hStartEvent ); 
        return false;
    }


    if ( GetLastError() == ERROR\_ALREADY\_EXISTS ) {

        CloseHandle( m\_hStartEvent ); 
        m\_hStartEvent = NULL;
        // already exist
        // send message from here to existing copy of the application
        return false;
    }
    // the only instance, start in a usual way
    return true;
}


/*
Ovennævnte kode virker, selv når man forsøger at åbne anden instans FRA EN FORSKELLIG LOGIN, LEAVING DEN FØRSTE LOGIN ÅBEN MED DIN INSTANSRUNNING.
*/

Andre referencer 2


Når din ansøgning initialiseres, skal du oprette en mutex. Hvis den allerede findes, skal du finde den eksisterende ansøgning og bringe den til forgrunden. Hvis applikationen har en fast titel til hovedvinduet, er den let at finde med FindWindow.


m\_singleInstanceMutex = CreateMutex(NULL, TRUE, L"Some unique string for your app");
if (m\_singleInstanceMutex == NULL || GetLastError() == ERROR\_ALREADY\_EXISTS) {
    HWND existingApp = FindWindow(0, L"Your app's window title");
    if (existingApp) SetForegroundWindow(existingApp);
    return FALSE; // Exit the app. For MFC, return false from InitInstance.
}

Andre referencer 3


Opret navngiven begivenhed i starten og tjek resultatet. Luk applikation, hvis begivenheden allerede findes.


BOOL CheckOneInstance()
{
    m\_hStartEvent = CreateEventW( NULL, TRUE, FALSE, L"EVENT\_NAME\_HERE" );
    if ( GetLastError() == ERROR\_ALREADY\_EXISTS ) {
        CloseHandle( m\_hStartEvent ); 
        m\_hStartEvent = NULL;
        // already exist
        // send message from here to existing copy of the application
        return FALSE;
    }
    // the only instance, start in a usual way
    return TRUE;
}


Luk m\_hStartEvent på appafslutningen.

Andre referencer 4


Har du ikke allerede mulighed for at kontrollere, om din ansøgning kører? Hvem har brug for en Mutex, hvis porten allerede er taget, ved du, at appen kører!