C++ Builder Snippets  

Mehrfache Programmausführung unterbinden:
 
Um die mehrfache Ausführung des Programms unter Windows zu unterbinden, muss die WinMain()-Funktion in der Datei projektname.cpp folgendermassen modifiziert werden:
  1. Fügen Sie folgenden Code vor der Zeile 'Application->Initialize();' in die WinMain() ein:


  2. // *************************************************************
    // Versuche Mutex zu öffnen:
    HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "MeineAnwendung1.0");
    
    // Mutex-Handle ist 0, Mutex erzeugen:
    if (!hMutex)
      hMutex = CreateMutex(0, 0, "MeineAnwendung1.0");
    else
    {
      // Dies ist die 2. Programminstanz. Die erste Instanz in 
      // Vordergrund bringen:
      HWND hWnd = FindWindow(0, "FensterTitel");
      SetForegroundWindow(hWnd);
    
      // Meldung ggf. anzeigen:
      ShowMessage("Das Programm ist bereits aktiv. Es kann nicht erneut gestartet werden !");
      return 0;
    }
    // *************************************************************
    

    - Der Mutex-Name (hier "MeineAnwendung1.0") kann ein beliebiger String sein.
    - Der Funktion FindWindow() muss der Titel des Hauptfensters der Anwendung im 2. Parameter übergeben werden !


  3. Fügen Sie folgenden Code hinter der Zeile Application->Run(); in die WinMain() ein:

  4. // *************************************************************
    // Mutex wieder freigeben:
    ReleaseMutex(hMutex);
    // *************************************************************


--- Beispieldatei Projektname.cpp ---

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

USERES("Projektname.res");
USEFORM("FormMain.cpp", frmMain);

//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  try
  {

    // *************************************************************
    // Versuche Mutex zu öffnen:
    HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "MeineAnwendung1.0");

    // Mutex-Handle ist 0, Mutex erzeugen:
    if (!hMutex)
      hMutex = CreateMutex(0, 0, "MeineAnwendung1.0");
    else
    {
      // Dies ist die 2. Programminstanz. Die erste Instanz in 
      // Vordergrund bringen:
      HWND hWnd = FindWindow(0, "FensterTitel");
      SetForegroundWindow(hWnd);

      // Meldung ggf. anzeigen:
      ShowMessage("Das Programm ist bereits aktiv. Es kann nicht erneut gestartet werden !");
      return 0;
    }
    // *************************************************************

    Application->Initialize();
    Application->CreateForm(__classid(TfrmMain), &frmMain);
    Application->Run();


    // *************************************************************
    // Mutex wieder freigeben:
    ReleaseMutex(hMutex);
    // *************************************************************
  }
  catch (Exception &exception)
  {
    Application->ShowException(&exception);
  }
  return 0;
}
//---------------------------------------------------------------------------



© '99-2001 by S. Kreutzmann