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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 13 oct. 2004 à 19:01
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 - 13 oct. 2004 à 23:27
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/26799-empecher-la-multi-instance-a-l-aide-d-un-mutex

Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
13 oct. 2004 à 23:27
Merci, voila, c'est fait ! autre chose ? :-))
@++ et merci! :)
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
13 oct. 2004 à 22:11
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 ...

++
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2004 à 21:50
lstrcpy copie bien le terminateur NULL mais tant qu'on n'est pas en UNICODE, strcpy fera aussi bien l'affaire.
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
13 oct. 2004 à 21:37
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 !
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
13 oct. 2004 à 20:50
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! :-))
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
13 oct. 2004 à 20:25
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' ! :-))
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
13 oct. 2004 à 20:05
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 ...

@+
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2004 à 19:19
ici tu auras 2 techniques differentes:

UNIQUE INSTANCE PROG (WIN32)
http://www.cppfrance.com/code.aspx?ID=25238
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
13 oct. 2004 à 19:10
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 :)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2004 à 19:01
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.
Rejoignez-nous