doppeltes öffnen eines programmes vermeiden



  • Wie kann ich es verhindern, dass ein Programm 2-mal geöffnet werden kann?

    danke im voraus.



  • öffne ne datei so, dass nur dein programm drauf zugreifen kann, wenn du die datei nicht öffnen kannst, dann ist eine instanz deines programms am laufen, also beende es...

    das wäre das einfachste denk ich mir.

    rapso->greets();

    ps. es gibt noch speziele sachen dafür, hab aber mein buch wo's drin steht nicht mit, deswegen kann ich dir keinen hint geben... 😞 (man muss nicht alles wissen, aber wissen wo man's nachschlagen kann 😉 )



  • Bau das in WinMain ein:

    *HANDLE hSem = CreateSemaphore(NULL, 0, 1, "Name des Programmes");
    if (hSem)
    {
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
    //Die Semaphore existiert bereits, also beenden
    HWND ahwnd;
    ahwnd = FindWindow(szAppName,0);

    SendMessage(ahwnd,WM_COMMAND,ID_ADDFILE,Parameter);
    return 0;
    }
    }



  • CreateMutex

    HANDLE mHandle;
    
    mHandle=CreateMutex(NULL,true,"EinEindeutigerString");
    if (mHandle!=NULL)
    {
       if (GetLastError()==ERROR_ALREADY_EXISTS)
       {
          // Anwendung bereits einmal gestartet
       }
    }
    

    ...nicht vergessen, am Programmende das mHandle wieder per CloseHandle() freizugeben...

    Hmm, knob's lösung ist glaube ich besser (und bestimmt im Gegensatz zu diesem hier getestet...)

    Edit by flenders: Ich habe den Code jetzt entsprechend der Anmerkung von -King- korrigiert 🙂



  • Hmm, knob's lösung ist glaube ich besser

    Mir gefällt die Mutex-Lösung besser. Die Funktinalität, die Dir die Semaphoren bieten, wird hier auch nicht benötigt. Allerdings würde ich den zweiten Parameter von CreateMutex() auf FALSE setzen. Die Prüfung des Handles ist auch nicht richtig. Wenn das Mutex bereits existiert, bekommst Du trotzdem ein gültiges Handle zurück. Nur ist dann eben GetLastError() nicht ERROR_SUCCES.

    Die Lösung des knobs benötigst Du dann, wenn Du die Anzahl der Instanzen auf einen bestimmten Wert begrenzen mußt, z.B. auf 7 oder 8 oder was weiß ich.

    Aber wie auch immer, es führen viele Wege in die Kneipe ...



  • es führen viele Wege in die Kneipe
    Der Spruch ist gut 😉



  • Ich habe auch noch einen Vorschlag:

    Einen benannten Shared-Memory-Bereich. Da kann man dann auch gleich den Fensterhandle des ersten Programmes ablegen. Wird das Programm zum zweiten mal gestartet, kann es nicht nur feststellen, dass es schon läuft, sondern auch gleich noch die erste Instanz aktivieren.



  • Ich danke euch erstmal allen.

    Habe selbst eine lösung gefunden (nachdem ich die Funktion FindWindow() gesehen habe..., und das spricht nicht gerade für mich, denn die sollte man wohl eigentlich kennen) Aber zumindest funktioniert es.

    Ich habe in die WinMain vor dem registrieren der Fensterklasse folgendes eingesetzt:

    if (!FindWindow(NULL, "szWindowName"))
    {
    //windowclass registrieren
    }
    else 
    return 0;
    

    funzt.

    EDIT ( -King- )
    Der Ansatz mit FindWindow() funktioniert nicht. Wenn Ihr direkt hintereinander zwei Doppelklicks macht, startet das Programm zweimal. Das erste Fenster wird sogut wie immer nicht schnell genug erstellt, so daß es mit FindWindow() nicht gefunden werden kann.

    [ Dieser Beitrag wurde am 28.09.2002 um 01:12 Uhr von CMatt editiert. ]



  • ...wäre das nicht mal wieder was für die faq?


Anmelden zum Antworten