IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Eviter de lancer 2 fois le même programme


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut Eviter de lancer 2 fois le même programme
    Bonjour,
    je suis passé de C++Builder 2007 à C++Builder 2009.
    Pour éviter dse lancer 2 fois la même application j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    //---------------------------------------------------------------------------
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	HANDLE hMutex;
    	try
    	{
    
    		 char nom[256];
    		 AnsiString asNom = Application->ExeName;
    		 strcpy(nom, asNom.c_str());
    		 hMutex=CreateMutex(NULL, TRUE, nom);
    		 if( (hMutex==NULL) || (GetLastError() == ERROR_ALREADY_EXISTS) )
    		 {
    		   // Fermeture du Mutex
    		   CloseHandle(hMutex);
    		   Application->Title="";
    		   HWND hPrevApp=::FindWindow(NULL, nom);
    		   if(hPrevApp)
    				PostMessage(hPrevApp, WM_SYSCOMMAND, SC_RESTORE, 0);
    		   return 0;
    		 }
    
    		// Cacher l'application de la barre des tâches
    		SetWindowLong(Application->Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
    		Application->Initialize();
    		Application->Title = "Heure-Internet";
    		Application->CreateForm(__classid(TForm1), &Form1);
    		Application->CreateForm(__classid(TfSites), &fSites);
    		Application->CreateForm(__classid(TfReglages), &fReglages);
    		Application->Run();
    	}
    	catch (Exception &exception)
    	{
    		Application->ShowException(&exception);
    	}
    	catch (...)
    	{
    		try
    		{
    			throw Exception("");
    		}
    		catch (Exception &exception)
    		{
    			Application->ShowException(&exception);
    		}
    	}
    	return 0;
    }
    //---------------------------------------------------------------------------
    Maintenant le programme ne se lance plus.

    Quelqu'un aurait-il une idée de l'origine du problème ?
    Merci.

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Par défaut
    Met un point d'arrêt sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiString asNom = Application->ExeName;
    et exécute en pas à pas pour voir ce que fait vraiment ton programme. Tu peux rajouter des points de suivis pour voir les valeurs des différentes variables.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    Bonjour,

    Premièrement, merci d'avoir posé cette question, ça m'a permis d'apprendre comment bloquer mon programme de ne pas ouvrir en multiple exemplaire.

    Deuxièmement, je crois que ton problème vient de ton asNom. J'ai essayé le même code que toi, marche pas. J'ai lu un peu sur les Mutex pour finalement comprendre que ton code est bon.

    En remplaçant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		 AnsiString asNom = Application->ExeName;
    Par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		 AnsiString asNom = "follow.exe";
    (où follow.exe est le nom de mon application, même si je ne pense pas que ça change grand chose, il suffit d'avoir un nom : j'ai essayé avec et c'est aussi fonctionnel).

    Peut-être est-ce que le mutex au nom de "Application->ExeName" est réservé...

    enfin voilà

    ciao

    antoine

    encore une fois merci de m'avoir ouvert les yeux sur les Mutex!



    EDIT :

    Voici mon code complet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	HANDLE hMutex;
    	try
    	{
    		char nom[256];
    		 //AnsiString asNom = Application->ExeName;
    		 AnsiString asNom = "alloa";
    		 strcpy(nom, asNom.c_str());
    		 hMutex= CreateMutex(NULL,true,nom);
    		 if( (hMutex==NULL) || (GetLastError() == ERROR_ALREADY_EXISTS) )
    		 {
    		   ShowMessage("Seulement un examplaire du programme peu être ouvert à la fois.");
    		   // Fermeture du Mutex
    		   CloseHandle(hMutex);
    		   Application->Title="";
    		   HWND hPrevApp=::FindWindow(NULL, nom);
    		   if(hPrevApp)
    				PostMessage(hPrevApp, WM_SYSCOMMAND, SC_RESTORE, 0);
    		   return 0;
    		 }
     
    		Application->Initialize();
    		SetApplicationMainFormOnTaskBar(Application, true);
    		Application->CreateForm(__classid(TFPrincipale), &FPrincipale);
    		Application->CreateForm(__classid(TFRecherche), &FRecherche);
    		Application->CreateForm(__classid(TFPlan), &FPlan);
    		Application->CreateForm(__classid(TFResultats), &FResultats);
    		Application->CreateForm(__classid(TFOption), &FOption);
    		Application->CreateForm(__classid(TFAvenirOpt), &FAvenirOpt);
    		Application->CreateForm(__classid(TFDetailPorte), &FDetailPorte);
    		Application->CreateForm(__classid(TFBatchDetail), &FBatchDetail);
    		Application->CreateForm(__classid(TFFeuilleMDF), &FFeuilleMDF);
    		Application->Run();
    	}
    	catch (Exception &exception)
    	{
    		Application->ShowException(&exception);
    	}
    	catch (...)
    	{
    		try
    		{
    			throw Exception("");
    		}
    		catch (Exception &exception)
    		{
    			Application->ShowException(&exception);
    		}
    	}
    	return 0;
    }

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Par défaut
    Je vous remercie.
    Le problème venait bien de asNom=Application->ExeName.
    Je l'ai remplacé par n'importe quoi et ça marche.
    Je suis surpris parce qu'avant cela marchait.
    Est-ce du à C++Builder 2009 ou à Vista ?
    L'essentiel est que cela fonctionne.

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    Je fonctionne sous 2007, alors je dirais que c'est peut-être dans la chaîne de charactère le problème. Il ne doit pas aimer les "c:\program files\...\...\bonjour.exe". Les "espaces" et/ou les "\" doivent lui donner des maux de tête.

    Enfin, je ne sais pas trop, ce n'est que mon intuition...

    antoine

    EDIT : Je suis sous Windows XP aussi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Eviter de charger plusieurs fois la même url
    Par Dynamès dans le forum Général Java
    Réponses: 5
    Dernier message: 23/07/2012, 09h13
  2. [Débutant] Lancer plusieurs fois le même projet
    Par Jazz_ dans le forum C#
    Réponses: 2
    Dernier message: 06/12/2011, 12h37
  3. Lancer 2 fois la même application
    Par Magrak dans le forum Windows XP
    Réponses: 2
    Dernier message: 17/12/2009, 12h53
  4. [AJAX] Comment lancer 2 fois send() dans la même page
    Par anaranjado dans le forum AJAX
    Réponses: 2
    Dernier message: 17/08/2009, 04h36
  5. Réponses: 23
    Dernier message: 08/02/2006, 09h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo