Empécher double exécution

aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 - 25 juin 2007 à 16:03
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 26 juin 2007 à 17:05
    Salut!

Je fais une petite GUI.
J'ai donc un .exe, mais j'aimerais qu'il soit impossible de l'exécuter deux fois.
Est-ce possible?

Je pensais par exemple à récupérer la liste des processus, et si je me trouve dedans, je quitte, non?

Merci de votre aide

8 réponses

the_wwt Messages postés 177 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 16 janvier 2009 1
25 juin 2007 à 16:35
Bonjour,
oui c'est plutôt une bonne idée... Aussi si c'est pas pour des hacker, un moyen simple est de créer un fichier a l'ouverture.
Et le supprimer en quittant, au démarage tu vérifie s'il existe.
Un problème apparait sil'appli plante...
Cordialement,
Pierrick
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
25 juin 2007 à 16:57
C'est possible avec un Mutex:

CreateMutex(0, 1, "monappli");
if (GetLastError() == ERROR_ALREADY_EXISTS)
return 0; // L'application est déjà lancé

C++ (@++)<!--
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
25 juin 2007 à 18:54
SAKingdom > ok si c'est sans interface utilisateur sinon le type va s'énerver un moment sur son raccourci en se demandant pourquoi son prog ne se lance pas.
Faut bien entendu ramener le prog au 1er plan, c'est la norme sur un système graphique.
UNIQUE INSTANCE PROG (WIN32)
http://www.cppfrance.com/code.aspx?ID=25238

ciao...
BruNews, MVP VC++
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
25 juin 2007 à 21:41
Ben on peut toujours utiliser FindWindow avec SetForegroundWindow pour ramener la fenêtre principal en avant plan mais c'est surement pas aussi sûr que du FileMapping.

C++ (@++)<!--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
26 juin 2007 à 08:17
Merci les gars.

j'ai téléchargé la source que tu me passes [auteurdetail.aspx?ID=39449 BruNews], mais mon soucis est que je fais pas du VisualC++ mais du QT.
J'ai donc comme départ un
int main(int argc, char *argv[])

et donc il me manque tous les arguments que tu récupères dans la fonction WinMain...

Comment faire svp?
0
aurelien2723 Messages postés 181 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 26 janvier 2011 1
26 juin 2007 à 09:00
J'ai opté pour une solution plus simple, qui me convient (tampis si la fenetre revient pas au premier plan, l'utilisateur est averti par une messageBox.
    FPrincipaleImpl *fenetre = new FPrincipaleImpl;
    fenetre->setGeometry((int)(QApplication::desktop()->width() - intLargeurFenetre) / 2, (int)(QApplication::desktop()->height() - intHauteurFenetre - 15) / 2, intLargeurFenetre, intHauteurFenetre);

    /** on créé un mutex pour empêcher la double exécution
    */
    CreateMutex(0, 1, L"monappli");
    if (GetLastError() == ERROR_ALREADY_EXISTS) 
     {
       /** si le programme est déjà ouvert, on ferme l'appli est on prévient l'utilisateur à l'aide d'une messageBox
       */
       delete fenetre->trayIcon;
       QMessageBox::warning(fenetre, "Erreur", "L'application est déjà lancée. Vérifiez dans le systray.", QMessageBox::Ok);
       return 0; 
     }


Merci à vous! :)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 juin 2007 à 16:42
Y'a surement un moyen de s'arranger avec la méthodes du FileMapping. Tu pourrais, par exemple, copier en mémoire, au lieu du HWND, le pointeur FPrincipalImpl de ta fenêtre principal puis utiliser une fonction ou une méthode de la classe pour la mettre en avant plan (ça doit surement exister).

Sinon, tu peux toujours utiliser FindWindow avec SetForegroundWindow pour avoir ta fenêtre au premier plan.
SetForegroundWindow(FindWindow(0, "Nomdelafenetre"));

C++ (@++)<!--
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
26 juin 2007 à 17:05
Ce n'est pas "du VC++" ma source mais du Win32 auquel tout langage doit normalement pouvoir accéder.

ciao...
BruNews, MVP VC++
0