Doppelten Programmstart verhindern ?

NinjaOne

Erfahrenes Mitglied
Wie kann ich verhindern, dass ein Programm (Mfc-Dialog) doppelt gestartet werden kann ?

Schon mal danke für eure Antworten.
 
Ja, das kann man mit einem Mutex machen. Ich habe hier im Forum schon mal was dazu gesehen. Such da mal oder schau in der MSDN nach. Die entsprechende MFC-Klasse heisst CMutex. Ein Mutex ist eine Art systemweites Signal, dass der erste Dialog anschalten kann. Wenn der zweite dann sieht, dass es dies schon gibt, kann er sich beenden.
 
Da kann ich nur das Singleton Entwurfsmuster empfehlen... ich probiers mal eben aus dem Kopf, bitte schlagt mich nicht wenns nen Fehler enthält ;)

Code:
singleton* singleton::pexemplar = NULL;
 
class singleton
{
	public : static singleton* exemplar();
	private : singleton();
				 ~singleton();
				static singleton * pexemplar;
}
 
 
singleton* singleton::exemplar()
{
   if(pexemplar == NULL)
		pexemplar = new singleton();
   return pexemplar;
}
 
 
void main()
{
   singleton * test = singleton::exemplar();
   ............
}



Das sollte es sein, damit kannst du sicher sein das es immer nur max ein Exemplar deiner Klasse gibt.

Gruss

MFC OpenGL
 
Innerhalb einer Anwendung ist das ein sehr nützliches Pattern. Aber das alleine wirkt nicht systemweit. Will sagen, du kannst damit alleine nicht verhindern, dass die Anwendung ein zweites Mal gestartet werden kann.
 
Ups, jo, hast vollkommen recht @ Kachelator.... Habe da irgendwas verwechselt... das kommt davon wenn man in verschiedenen Posts rumspringt ;) Ich lasse das trotzdem mal hier stehen, evtl sucht ja jemand mal nach Singleton *g*


Denke mal zum Problem ansich würde ich dann auch CMutex verwenden, oder mir über die Funktionen der windows.h und die Programmid den Programmnamen holen, und wenn der mit deinem übereinstimmt das Programm dann direkt beenden. (Haut natürlich nicht hin wenn es Freaks gibt die den EXE Namen umbenennen*ggg*)
 
Man könnte auch mit FindWindow() nach einem entsprechenden Fenster suchen und auf diese Weise feststellen, ob schon eine Instanz läuft. Ist aber nicht so sauber.

Übrigens ist deine Singleton-Implementierung abgesehen von ein paar Details nicht schlecht. Der private Destruktor verhindert nachhaltig auch den Einsatz von Copyconstructor und Zuweisungsoperator. Allerdings: Was passiert am Ende mit der einzelnen Instanz? Die hast du genewt. Und wer gibt sie frei? Das ergibt ein Memoryleck!
 
Hi ...
kenn CMutex nicht, hab das bis jetzt immer so gemacht:

Code:
#pragma data_seg("XYZ")

static HWND isRunning = NULL;

#pragma data_seg()
#pragma comment(linker, "/section:XYZ,rws")

in der initialisierung dann:
if(isRunning)
{
  // abbrechen und mittels des Handles das alte Fenster in den Vordergrund bringen
}

isRunning = dlg.m_hWnd;

Da darf man das Dialog-Fenster allerdings nicht sofort mit DoModal aufrufen sondern muss es erst erstellen, dann das Handle speichern und dann DoModal machen...

Ist vielleicht umständlicher, weiß ich jetzt nicht, aber wollte einfach mal meinen Lösungsvorschlag posten.

Gruß
Shai
 

Neue Beiträge

Zurück