Partage
  • Partager sur Facebook
  • Partager sur Twitter

Limiter à une ouverture du programme

    4 octobre 2007 à 21:08:38

    Salut,
    Je voudrais limiter l'ouverture de mon programme à une simultanément.
    L'application ne doit pas obligatoirement être portable car le programme n'est pas vraiment portable (winsock2).
    Savez vous comment faire ?
    Je n'ai pas vraiment d'idée. :euh:
    Merci d'avance.

    Gp2mv3
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      4 octobre 2007 à 21:21:09

      Peut-être en regardant si le processus existe déjà (récupération des processus, plus vérification si le nom existe plus de 1 fois). Je n'ai jamais essayé.
      • Partager sur Facebook
      • Partager sur Twitter
        4 octobre 2007 à 21:33:19

        La solution la plus simple mais la moins efficace a laquelle je pense sans trop réfléchir est de créer un fichier contenant un booléen indiquant si un programme s'execute déjà.
        Il suffis de l'éditer a l'ouverture et a la fermeture du programme.
        Mais le problèmme c'est que passer par les fichier requiert que les deux execution ne soit pas lancer au même moment, la lecture simultaner d'un fichier par deux programme peut causer des problèmes il me semble...
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          4 octobre 2007 à 21:39:31

          Et si le programme est mal quitté? suffit d'une fois et c'est foutu. :(
          • Partager sur Facebook
          • Partager sur Twitter
            4 octobre 2007 à 21:44:33

            avec l'API win32 c'est sûr. Si ton programme utilise des fenêtres, utilise FindWindow, sinon comme Huira l'a dit.
            • Partager sur Facebook
            • Partager sur Twitter
              7 octobre 2007 à 20:45:58

              Le truc, c'est que le programme fonctionne sous irrlicht donc je sais pas trop si findwindow marchera...
              Mais si non, c'est vrai que l'histoire des processus n'est pas une mauvaise idée mais je ne sais pas trop comment faire.

              Bien amicalement.

              Gp2mv3
              • Partager sur Facebook
              • Partager sur Twitter
                8 octobre 2007 à 1:12:11

                FindWindow marche même si t'es sous irrlicht. Sinon pour utiliser le processus tu peux t'inspirer de ce code:
                1. PROCESSENTRY32 pe32 = {0};//on initialise la structure PROCESSENTRY32
                2.         HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//on prend la liste de tout les process
                3.         BOOL bContinu;
                4.         vecteurObjet = new vector<Objet>;
                5.         if(!hProcessSnap){//si l'optention de la liste a échouer :
                6.                 MessageBox::Show("Erreur lors de l'optention de la liste des process : "+  GetLastError(),"Erreur !", MessageBoxButtons::OK, MessageBoxIcon::Warning);
                7.                 return;
                8.         }
                9.         pe32.dwSize = sizeof(PROCESSENTRY32);//on initialise la grandeur de la struc
                10.                                                                                 // PROCESSENTRY32
                11.         bContinu = Process32First(hProcessSnap, &pe32);//on prend le premier process de la liste
                12.         while(bContinu){//tant qu'il y a des process, on prend le nom et l'insère dans le vecteur
                13.                 vecteurObjet->push_back(new Objet(gcnew String("[0x"+ gcnew String((pe32.th32ProcessID + "")) + "] " + new String(pe32.szExeFile)), pe32.th32ProcessID));
                14.                 bContinu = Process32Next(hProcessSnap, &pe32);
                15.         }

                Image utilisateur
                Ensuite tu n'a qua vérifer dans le vecteur si ton application est déjà lancer.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  8 octobre 2007 à 1:50:45

                  Salut,

                  dans une optique differente, tu peux essayer avec un mutex. C'est un peu plus facile à coder qu'enumerer tous les process.

                  Plus d'infos, ici (kb microsoft).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 octobre 2007 à 2:00:31

                    Sinon, ya une manière plus simple, que je n'ai pas testé en c++, mais qui devrais théoriquement marcher : le verrouillage d'un fichier :

                    1 - si un fichier vide ... disons, "C:\mylock.uinst" n'existe pas, passer à l'étape 4;
                    2 - si le fichier existait déjà, tentative d'effacement du fichier;
                    3 - si le fichier existe encore (ou la méthode d'effacement indique une erreur), afficher "une instance est en cours !";
                    4 - sinon, recréer le fichier, et l'ouvrir en écriture (verrouillage), de manière à ce qu'il se crée automatiquement s'il n'existe pas (ce qui est le cas présentement);
                    5 - à la fin du programme, fermer le fichier. Au choix, tu peux effacer le fichier, pour ne pas faire de déchet sur le système ;)

                    Voilà, c'est assez simple et facile à prendre en main ^^

                    EDIT : je m'en vais de ce pas le tester ^^

                    EDIT #2 : ce code-ci semble marcher :D :

                    1. #include <stdio.h>
                    2. int main (int argc, char** argv) {
                    3.     FILE *file = fopen("C:\\mylock.uinst","r");
                    4.     if (file != NULL) {
                    5.             fclose(file);
                    6.             if (remove("C:\\mylock.uinst") != NULL)
                    7.                     return 666;
                    8.     }
                    9.     file = fopen("C:\\mylock.uinst","w");
                    10.     // le vrai début du programme...
                    11.     // ...
                    12.     // à la fin :
                    13.     fclose(file);
                    14.     remove("C:\\mylock.uinst");
                    15.     return 0;
                    16. }


                    m'enfin, je l'ai fait à la hâte; il doit bien y avoir une manière plus "c++" :p
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                    Anonyme
                      8 octobre 2007 à 10:14:01

                      Citation : hiura

                      Et si le programme est mal quitté? suffit d'une fois et c'est foutu. :(


                      +1
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 octobre 2007 à 13:03:30

                        huira > ou moins on peut le supprimer à la main si le logiciel à buguer
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          8 octobre 2007 à 13:14:52

                          Citation : ミニロプ

                          huira > ou moins on peut le supprimer à la main si le logiciel à buguer


                          Si tu distribue ton programme, je doute que l'utilisateur s'amuse à trouver d'où vient le problème quand le programme ne démarrera pas. ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 octobre 2007 à 13:17:01

                            justement, quand le logiciel démarre et que le fichier existe, on affiche un message du genre :
                            "le logiciel est déjà lancé, si ce n'est pas le cas, supprimez 'C:\xxx.txt'"
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              8 octobre 2007 à 13:21:09

                              Oui, c'est vrai je n'y avais pas pensé, mais quand même : je parts de l'idée que l'utilisateur ne doit rien faire de spéciale (supprimer un fichier par exemple) pour utiliser le programme. Après libre à gp2mv3 de choisir.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 octobre 2007 à 16:13:18

                                j'ai pas ce problème, avec ma méthode ^^ j'ai même essayé de quitter abrutement durant le programme (fait un "return 0;"), et aucun problème pour réexecuter le programme, même si le fichier existe encore.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                                Anonyme
                                  8 octobre 2007 à 16:51:56

                                  Citation : shadosan

                                  j'ai pas ce problème, avec ma méthode ^^ j'ai même essayé de quitter abruptement durant le programme (fait un "return 0;"), et aucun problème pour réexecuter le programme, même si le fichier existe encore.

                                  Et si tu coupes le processus? Car si tu fais un return dans le main, ça quitte ton programme "normalement".
                                  (Mais j'ai un doute : on peut lire un fichier depuis plusieurs programme ou bien? je pose cette question car avec Notepad++ on a la possibilité de charger le fichier modifié par un autre programme si on était en train de travailler dessus.)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    8 octobre 2007 à 17:09:39

                                    Citation : Pas de titre

                                    Et si tu coupes le processus?


                                    Aucun problème détecté.

                                    Citation : Pas de titre

                                    Mais j'ai un doute : on peut lire un fichier depuis plusieurs programme ou bien?


                                    ouais, on peux.
                                    on peux tout autant l'ouvrir en écriture/lecture 2 fois (ou +) dans le même programme, si ça te chante.
                                    par contre, si un programme a ouvert un fichier en écriture ou en lecture, le fichier n'est pas effaçable / renommable (pas sûr pour renommable...), tant et aussi longtemps qu'il y a un programme qui l'utilise.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                                    Anonyme
                                      8 octobre 2007 à 17:27:50

                                      ben dans ce cas :

                                      Citation : hiura

                                      Citation : hiura

                                      Et si le programme est mal quitté? suffit d'une fois et c'est foutu. :(


                                      +1


                                      -1 :)

                                      Ça change tout!
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        8 octobre 2007 à 18:55:52

                                        Citation : shadosan

                                        on peux tout autant l'ouvrir en écriture/lecture 2 fois (ou +) dans le même programme, si ça te chante.



                                        Salut,

                                        dans ce cas, il faut alors bien specifier les modificateurs d'ouverture, et tu specifies un R/W exclusive (sous Win32 du moins) comme ca tout autre process qui tenteras d'ouvrir le fichier echouera (retour HFILE_ERROR du OpenFile), et pas besoin d'autres manipulation.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          8 octobre 2007 à 21:33:02

                                          la méthode de Shadosan marche normalement, et tu ne peux pas ouvrir deux fois le même fichier en écriture je crois!

                                          et pour rennomer, je pense aussi, je viens d'en voir la preuve, je ne pouvais pas renomer un dossier parce que cmd.exe été dessus, donc il suffit d'un programme qui le lise en écriture, et les autres ne peuvent plus rien faire (normalement)

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            9 octobre 2007 à 0:11:32

                                            Citation : Geoffroy

                                            la méthode de Shadosan marche normalement, et tu ne peux pas ouvrir deux fois le même fichier en écriture je crois!



                                            je viens de tester, et ça marche :

                                            1. int main ( int argc, char** argv ) {
                                            2.     FILE *fileUn = fopen("test.txt","w");
                                            3.     FILE *fileDeux = fopen("test.txt","r");
                                            4.     FILE *fileTrois = fopen("test.txt","r");
                                            5.     FILE *fileQuatre = fopen("test.txt","w");
                                            6.     if (fileUn == NULL || fileDeux == NULL ||
                                            7.         fileTrois == NULL || fileQuatre == NULL) {
                                            8.         std::cout << "erreur!";
                                            9.         return 666;
                                            10.     }
                                            11.     fclose(fileUn);
                                            12.     fclose(fileDeux);
                                            13.     fclose(fileTrois);
                                            14.     fclose(fileQuatre);
                                            15.     remove("test.txt");
                                            16.     return 0;
                                            17. }


                                            par contre ça risque d'être chaud pour écrire / lire, car leur pointeur dedans le fichier n'est pas tous à la même position... mais ça, ça n'as aucun rapport avec le sujet ^^
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                                              9 octobre 2007 à 15:36:36

                                              Le commentaire de Sir Julio est un passé dans le beurre mais c'est la solution Windows favorite : les Mutex

                                              les mutex sont de simples informations : une chaine de lettre dans le registre... si la chaine existe c'est que le mutex est demandé :


                                              Squelette :

                                              Début de programme :
                                              Essai créer mutex : il existe ?
                                              --> Oui : on quitte avec message
                                              --> Non : on continue

                                              à la fin du programme on détruit le mutex.

                                              Windows se charge très bien de nettoyer les mutex non détruit lorsque le processus qui la créer se termine abruptement mais pour éviter de trop en demander au système d'exploitation tu peux facilement englober ton main dans un try-catch(...)

                                              1. int main()
                                              2. {
                                              3.     HANDLE hMutex = 0;
                                              4.     try
                                              5.     {
                                              6.         hMutex = CreateMutex( 0, FALSE, "MonMutex" );
                                              7.         if( hMutex == 0 )
                                              8.         {
                                              9.             // MessageBox ou autre
                                              10.         }
                                              11.         else
                                              12.         {
                                              13.              // ... reste du programme
                                              14.             ReleaseMutex( hMutex  );
                                              15.         }
                                              16.     }
                                              17.     // autres catch spécifiques
                                              18.     catch( ... )
                                              19.     {
                                              20.         // je m'assure du relachement
                                              21.         // du Mutex en cas d'exception
                                              22.         if( hMutex != 0 )
                                              23.             ReleaseMutex( hMutex );
                                              24.     }
                                              25.     if( hMutex != 0 )
                                              26.         CloseHandle( hMutex );
                                              27.     return 0;
                                              28. }


                                              Ça ressemble à ça, c'est un peu maladroit comme utilisation du catch mais à la base c'est pratique.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                9 octobre 2007 à 19:46:17

                                                Je vais plutot utiliser les mutex.
                                                Sa semble beaucoup plus simple. ;)

                                                Merci.

                                                Gp2mv3
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Limiter à une ouverture du programme

                                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                • Editeur
                                                • Markdown