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

Outils Delphi Discussion :

[Inno Setup] Détection de processus en cours


Sujet :

Outils Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2012
    Messages : 15
    Points : 6
    Points
    6
    Par défaut [Inno Setup] Détection de processus en cours
    Bonjour,

    Je cherche un moyen de détecter des processus en cours d’exécution qui pourrait perturber le bon déroulement de l'installation. J'ai bien compris qu'il fallait utiliser des "Mutex" par contre je ne bite rien de ce qu'il faut faire pour parvenir à :
    "Si processus MonProcessus01 ou MonProcessus02 alors demander à l'utilisateur de les fermer"

    Sur la documentation officielle ça parle de Delphi, C ou VB, je ne sais même pas pourquoi et AppMutex = MonProcessus dans [Setup] n'a aucun effet sans compter que je peux en mettre qu'un seul. Je ne vois pas non plus comment utiliser la procédure CreateMutex, la doc indiquant seulement que ça sert à créer des Mutex . . .
    Habituellement je trouve ce que je veux dans cette documentation mais là je sèche.

    J'ai également trouvé ceci sur un forum :
    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
    var HandleMutex : THandle;
     
    function IsRunning : Boolean;
      begin
      result := true;
      SetLastError(NO_ERROR);
      if OpenMutex(MUTEX_ALL_ACCESS,false,pChar('MonMtx'))<>0 then exit;
      HandleMutex  := CreateMutex(Nil,true,pChar('MonMtx'));
      if HandleMutex = 0 then ShowMessage('Erreur de Mutex')
                                  else result := false;
    end;
     
    ...
     
    procedure TForm1.FormDestroy(Sender: TObject);
      begin
      if HandleMutex <> 0 then ReleaseMutex(HandleMutex);
    end;
     
     
    Utilisation :
     
    procedure TForm1.FormCreate(Sender: TObject);
      begin
      if IsRunning then [désactiver l'option "mise à jour"];
    end;
    Mais j'ai le droit à 2 messages d'erreurs par ligne à l'exécution.

    Merci d'avance à tout ceux qui pourront m'apporter leurs lumières. Un bel exemple concret me ferait grand plaisir

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    En préambule, il faut que l'application dont on veut détecter la présence en mémoire dispose du même Mutex que le programme d'installation.
    Si l'installation peut s'appliquer à des serveurs d'applications (TSE, citrix), le Mutex doit être doté du préfixe Global, dans le cas contraire, le Mutex se limite à la session courante...

    Plus d'explications ici :
    HOWTO: Detect instances running in any user session with AppMutex
    Philippe.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2012
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci pour cette page je n'avais pas mis la main dessus.
    Il n'est pas du tout question de serveur. En fait j'ai sans doute oublié de préciser à quoi tout cela était destiné :
    Je développe un mod pour un jeu. Je voudrais d'une part vérifier que le jeu ou l'éditeur de niveau ne sont pas en cours d’exécution pour installer le mod et d'autre part pour les mises à jour, vérifier que le launcher du mod ne tourne pas non plus.

    J'ai fini par aller sur Wikipédia pour essayer de saisir ce que voulais dire Mutex. C'est une primitive de synchronisation pour éviter le partage de ressources simultanées . . .
    Dans l'exemple proposé je vois plein de MutexName mais je ne vois pas par quelle valeur je suis sensé remplacer.
    Où est-ce que j'indique le nom des processus, ceux qui apparaissent dans le gestionnaire de tâches ?

    J'arrive pas à me dégager de l'idée :
    Si jeu.exe OU editeur.exe OU launcher.exe Alors message d'avertissement ET bloquer l'installation

    Je me dit que j'ai peut-être plus vite fait de mettre un bout d'application en VB.NET à exécuter en début d'install car ça je sais le coder.

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par Syrius_Märx Voir le message
    Il n'est pas du tout question de serveur.
    Ne sachant pas à quoi cela était destiné, j'ai préféré rappeler cette règle pour le nommage des mutex...

    Citation Envoyé par Syrius_Märx Voir le message
    Je développe un mod pour un jeu. Je voudrais d'une part vérifier que le jeu ou l'éditeur de niveau ne sont pas en cours d’exécution pour installer le mod et d'autre part pour les mises à jour, vérifier que le launcher du mod ne tourne pas non plus.
    C'est alors relativement simple, si vous compilez le jeu en question ou que vous savez qu'il utilise un mutex; vous connaissez alors le nom du mutex.

    Côté Innosetup, il suffit de préciser dans le script de nom du Mutex :
    Côté application dans le cas où vous la compilez (je prends Delphi pour l'exemple), on a :
    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
    program MonJeu;
     
    uses
      Windows,
      Dialogs,
      Forms,
      UJeux in 'UJeux.pas' {MaFormduJeux};
     
    {$R *.res}
     
    var
      MutexHandle : THandle;
    begin
      MutexHandle := CreateMutex(nil, True, 'MonMutex');
      if (MutexHandle = 0) or
         (GetLastError = ERROR_ALREADY_EXISTS) then
      begin
        // Signaler une erreur ou la pré-existence du Mutex
        // Ne pas lancer le jeu
        MessageDlg('Jeu déjà lancé !', mtWarning, [mbAbort], 0);
      end
      else
      begin
        Application.Initialize;
        Application.CreateForm(TMaFormduJeux, MaFormduJeux);
        Application.Run;
        // Libérer le Mutex
        if MutexHandle <> 0 then
          CloseHandle(MutexHandle);
      end;
    end.
    Si vous n'avez pas accès au source du jeu ou ne connaissez pas le Mutex qu'il pourrait utiliser, il va falloir se tourner vers d'autres méthodes de détections : le nom du processus, le nom d'une fenêtre active, etc, etc.
    Philippe.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2012
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Juste je précise que l'installateur consiste à ajouter ou modifier des fichiers dans le répertoire du jeu dont le launcher du mod que j'ai développé en VB.NET. En revanche le jeu en question est développé par EA Games et je n'installe absolument pas l'exe du jeu ou de son éditeur. Mais je connais le nom des processus correspondant (= nom du Mutex ?).

    Donc en résumé il y a le launcher qui est compris dans l'install mais le jeu et l'éditeur sont des ressources externes.

    Par contre il y a quelque chose que je ne saisie toujours pas. Le language de la section [Code] de Inno Setup c'est bien du Pascal ?
    Pourquoi dès qu'on parle de Mutex je vois du Delphi voir du C ou VB ?

    En fait je crois que je viens de comprendre l'élément principal de cette affaire :
    Dans Inno Setup il suffit de mettre "AppMutex = MonMutex" et c'est dans mon launcheur que je dois créer l'instance de Mutex. Du coup je dois également découvrir le non du Mutex créer par le jeu et l’éditeur.

    Si c'est pas ça je comprend toujours pas. Il doit vraiment y avoir un élément bête qui m'échappe pour saisir le fonctionnement des Mutex.

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Un mutex est un objet qui sert à la synchronisation. A un instant donné, il ne peut être possédé que par un seul processus, d'où son nom : Mut(ual)ex(clusion).
    Un mutex est défini par son nom
    Vous pouvez implémentez un mutex dans votre lanceur, et définir le même dans l'installeur de votre lanceur.

    Pour VB, l'aide de Innosetup précise :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Visual Basic (submitted by Peter Young):
    'Place in Declarations section:
    Private Declare Function CreateMutex Lib "kernel32" _
            Alias "CreateMutexA" _
           (ByVal lpMutexAttributes As Long, _
            ByVal bInitialOwner As Long, _
            ByVal lpName As String) As Long
     
    'Place in startup code (Form_Load or Sub Main):
    CreateMutex 0&, 0&, "MyProgramsMutexName"
    Pour l'installeur, on aura dans le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AppMutex=MyProgramsMutexName
    Concernant le jeu de EA Games, il faudra pour s'assurer qu'il n'est pas lancé ne pas détecter sa présence dans la liste des processus.

    Voici un exemple en C# (cela doit s'adapter à VB.Net assez rapidement)
    Code c# : 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
    //Namespaces we need to use
    using System.Diagnostics;
     
    public bool IsProcessOpen(string name)
    {
        //here we're going to get a list of all running processes on
        //the computer
        foreach (Process clsProcess in Process.GetProcesses()) {
            //now we're going to see if any of the running processes
            //match the currently running processes. Be sure to not
            //add the .exe to the name you provide, i.e: NOTEPAD,
            //not NOTEPAD.EXE or false is always returned even if
            //notepad is running.
            //Remember, if you have the process running more than once, 
            //say IE open 4 times the loop thr way it is now will close all 4,
            //if you want it to just close the first one it finds
            //then add a return; after the Kill
            if (clsProcess.ProcessName.Contains(name))
            {
                //if the process is found to be running then we
                //return a true
                return true;
            }
        }
        //otherwise we return a false
        return false;
    }
    Citation Envoyé par Syrius_Märx Voir le message
    Par contre il y a quelque chose que je ne saisie toujours pas. Le language de la section [Code] de Inno Setup c'est bien du Pascal ?
    Pourquoi dès qu'on parle de Mutex je vois du Delphi voir du C ou VB ?
    En fait InnoSetup est programmé en Delphi et utilise pour la partie "scripting" du pascal objet inspiré du pascal Delphi (RemObjects pour la partie script)...
    Ce code dynamique est à différencier toutefois du script de base qu'utilise Innosetup pour bâtir un programme d'installation...
    Citation Envoyé par Syrius_Märx Voir le message
    Dans Inno Setup il suffit de mettre "AppMutex = MonMutex" et c'est dans mon launcheur que je dois créer l'instance de Mutex.
    Gagné !
    Citation Envoyé par Syrius_Märx Voir le message
    Du coup je dois également découvrir le non du Mutex créer par le jeu et l’éditeur.
    Rien ne dit que le jeu utilise un voire plusieurs mutex... ou une autre méthode pour s'assurer qu'un fichier est disponible, en vérifiant les verrous qui sont posés sur le fichier visé.
    Philippe.

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

Discussions similaires

  1. [INNO SETUP] Détection répertoire automatique
    Par 21stcentury dans le forum Outils
    Réponses: 2
    Dernier message: 05/08/2014, 17h23
  2. Réponses: 2
    Dernier message: 05/01/2012, 16h25
  3. détection d'un processus en cours
    Par beusse dans le forum C++
    Réponses: 2
    Dernier message: 10/01/2011, 20h03
  4. Réponses: 2
    Dernier message: 02/02/2009, 15h26
  5. Inno Setup, Installer un programme au cours de l'install
    Par red210 dans le forum Installation, Déploiement et Sécurité
    Réponses: 0
    Dernier message: 04/03/2008, 23h59

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