Empecher la multi-instance à l'aide d'un mutex :-)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 404 fois - Téléchargée 34 fois

Contenu du snippet

Bon, pour my first code sur codes sources, j'avais pas trop d'idée alors je commence par vous donner un moyen d'eviter que plusieurs instances d'une même application puissent etre en cicrculation au même moment...c'est à dire d'empecher qu'un meme programme soit lancé une 2ème fois si le premier lancement est encore actif!

Source / Exemple :


/* créer la classe CMutex dans le fichier Mutex.h */

#ifndef _MUTEX_H_
#define _MUTEX_H_

#if _MSC_VER > 1000
#pragma once
#endif

class CMutex {

 
   public:
   
     CMutex();
     CMutex(char* nom);
     virtual ~CMutex();
     
     bool ActiveMutex() const;
     void DesactiveMutex() const;
     void rename(char* new_nom);
     
   private:
   
     char* m_Nom;        
 };

#endif

/* fin de code...mnt le fichier Mutex.cpp a ajouter au projet ...... */

#include <windows.h>
#include "mutex.h"

CMutex::CMutex() {

  m_Nom = new char[lstrlen("NowelMutex") + 1];
  lstrcpy(this->m_Nom, "NowelMutex");
 }

CMutex::CMutex(char *nom) {

  m_Nom = new char[lstrlen(nom) + 1];
  lstrcpy(this->m_Nom, nom);
 }
 
CMutex::~CMutex() {

  delete m_Nom;
 }
 
bool CMutex::ActiveMutex() const {

  CreateMutex(NULL, TRUE, this->m_Nom);
  
  if (GetLastError() == ERROR_ALREADY_EXISTS)
   return false;
   
  return true; 
 }
 
void CMutex::DesactiveMutex() const {

  CreateMutex(NULL, FALSE, this->m_Nom);
 }
 
void CMutex::rename(char* new_nom) {

  delete [] m_Nom;
  m_Nom = new char[lstrlen(new_nom) + 1];
  lstrcpy(this->m_Nom, new_nom);
 } 

/* et voila !! */         

/* le code a mettre dans main.cpp par exemple */

#include "Mutex.h"
  
int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

CMutex* myMutex = new CMutex("MyApps");
   
   if (!(myMutex->ActiveMutex())) 
      ExitProcess(1);

  // autres instructions...
}

// voila, ben perso j'ai crée ce truc et je m'en sers maintenant tres souvent parce que c'est bien pratique ! Je n'ai pas trouvé de failles mais on sais jamais! lol !

Conclusion :


- Pas de bugs connus
- Source mise à jour the 13 octobre 2004 ! :-))

A voir également

Ajouter un commentaire

Commentaires

Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Merci, voila, c'est fait ! autre chose ? :-))
@++ et merci! :)
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

OK, ça copie bien le zéro terminal, mais supposons qu'un utilisateur insert un char* sans son zéro terminal, il y a de bonnes chances qu'il fasse planter sauvagement l'application ! (strlen renverra un résultat erroné). C'est une petite sécurité qu'il est indispensable de mettre ...

++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
23
lstrcpy copie bien le terminateur NULL mais tant qu'on n'est pas en UNICODE, strcpy fera aussi bien l'affaire.
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

tu as oublié :
delete[ ] m_nom;

rename est encore vulnérable. Comme je te l'ai dis dans le post précédent, il faut désallouer m_nom, puis réallouer la taille correcte, et enfin copier.
Je ne connais pas la fonction lstrcpy (non standard), mais je ne suis pas sur qu'elle copie aussi le caractère terminal '\0' ... Dans ce cas, il faut l'ajouter :
m_nom[strlen(m_nom)] = '\0'; (apres avoir allouer bien sur !)

voila, voila !
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

Voila c'est modifié !

Pour le bidule qui consiste a faire passer la window en first plan, je suis en cours d'étude de ta source! lol, en fait, je viens de débuter en prog Win32 dc c nouvo pr moi! :-))

Sinan, apres tout, si l'utilisateur n'est pas si noob, suffit qu'il voit en bas, dans la barre des taches, la new window ouverte! puis il clique dessus et hop! :-))
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.