begin process at 2012 05 27 16:00:56
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Application

 > EMPECHER LA MULTI-INSTANCE À L'AIDE D'UN MUTEX :-)

EMPECHER LA MULTI-INSTANCE À L'AIDE D'UN MUTEX :-)


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Application Niveau :Initié Date de création :13/10/2004 Date de mise à jour :13/10/2004 23:24:43 Vu :4 387

Auteur : Gendal67

Ecrire un message privé
Site perso
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

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

  • /* 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 !
 
/* 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 ! :-))


 Historique

13 octobre 2004 20:44:34 :
Correction de petits détails liés à la mémoire + modificateurs de type const ! :-))
13 octobre 2004 23:24:44 :
Corrigé de la vulnérabilité lié à l'owerflow de m_Nom dans rename()

 Sources du même auteur

Source avec Zip Source avec une capture LOGICIEL D'ENVOI D'EMAILS ANONYMES PAR PROTOCOLE SMTP
Source avec Zip Source avec une capture [WIN32] ROSTAND ACCESS RECOVERY (MIS À JOUR)
Source avec Zip Source avec une capture CRÉATEUR D' IMAGES CD (ISO), DE DOSSIER, PROTÉGÉE PAR MOT DE...
Source avec Zip Source avec une capture HACHEUR/COMPACTEUR PROFESSIONNEL DE FICHIER [WIN32]

 Sources de la même categorie

Source avec Zip Source avec une capture PROGRAMME DE SUDOKU par AffreuxJojp
Source avec Zip EVALUATEUR D'EXPRESSION ARITHMÉTIQUE par matrx180vTitanium
Source avec Zip Source avec une capture QBIBLIO GESTION DES PRÊTS par conatic
Source avec Zip Source avec une capture QL-CHATROOM V 1.0 par mature
Source avec Zip Source avec une capture GEOLOCALISATION par ganjarasta

Commentaires et avis

Commentaire de BruNews le 13/10/2004 19:01:02 administrateur CS

Salut,

il faut respecter le comportement standard sous Windows, le client qui lance son prog par raccourci ou autre doit le retrouver au 1er plan sinon il risque d'insister un bon moment. Le messageBox est inutile par contre.

Commentaire de Gendal67 le 13/10/2004 19:10:04


Euh, d'accord, merci, mais comment tu fais pour faire ne sorte que l'appli se foute au premier plan ?

Oui, la MessageBox, c juste pr le signaler à l'utilisateur, c tt :)

Commentaire de BruNews le 13/10/2004 19:19:27 administrateur CS

ici tu auras 2 techniques differentes:

UNIQUE INSTANCE PROG (WIN32)
http://www.cppfrance.com/code.aspx?ID=25238

Commentaire de plus_plus_fab le 13/10/2004 20:05:59

salut,

quelques petites remarques, si je peux me permettre ...
il ya une faille de sécurité dans le constructeur CMutex::CMutex(char *nom)
recuperella taille de nom, alloue dynamiquement de l'espace pour this->nom (la longueur de nom + 1 pour le zero terminal).
meme chose pour rename, desalloue, recupere la taille du nouveau "nom", puis realloue ...
il y a une fuite dans le destructeur, si tu alloues par new[ ], il faut desallouer par delete [ ] !

Si tu fais du C++, il faut te passer du char*, et utiliser std::string à la place, ça évite ces erreurs plutot embetantes ;-)

Pour la conception objet, nom devrait etre private, et
bool ActiveMutex();
void DesactiveMutex();
devraient etre déclarées const (elles ne modifient rien)
-> bool ActivateMutex()const;

bonne continuation ...

@+



Commentaire de Gendal67 le 13/10/2004 20:25:30

Ah vi! lol, merci plus_plus_fab! mdr! javé mem pas callé la possibilité d'owerflow! mais bon, en regle générale, je m'amuse pas a creer des Mutex de +de 100 caractères! lol! Mais ce n'est pas une raison, tu as bien raison de me le rappeler, je vais corriger ça!

BruNews, grand merci pour ton aide que tu me donnes chaque fois que j'ai un problême!

@+ tout le monde et merci de vos comment' ! :-))

Commentaire de Gendal67 le 13/10/2004 20:50:40


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! :-))

Commentaire de plus_plus_fab le 13/10/2004 21:37:08

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 !

Commentaire de BruNews le 13/10/2004 21:50:46 administrateur CS

lstrcpy copie bien le terminateur NULL mais tant qu'on n'est pas en UNICODE, strcpy fera aussi bien l'affaire.

Commentaire de plus_plus_fab le 13/10/2004 22:11:28

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 ...

++

Commentaire de Gendal67 le 13/10/2004 23:27:19

Merci, voila, c'est fait ! autre chose ? :-))
@++ et merci! :)

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales