Comment limiter les applications 32 bits à une instance de Visual C++

Traductions disponibles Traductions disponibles
Numéro d'article: 243953 - Voir les produits auxquels s'applique cet article
note Microsoft Visual C++ 2005, Visual C++ .NET 2003 et Visual C++ .NET 2002 prennent en charge le modèle de code géré qui est fourni par Microsoft .NET Framework et le modèle de code Microsoft Windows natif non géré. Les informations contenues dans cet article s'applique uniquement à un code Visual C++ non géré.
Agrandir tout | Réduire tout

Résumé

Cet article explique comment limiter une application à une instance. La méthode qui est utilisée dans cet article ne repose pas sur les Création de windows. Par conséquent, la méthode peut être utilisée pour limiter une application à une instance qui est développée en Visual C++. Cela inclut applications de console, applications WinCE, boîte de dialogue boîte basée applications, applications sans interface utilisateur graphique et autres applications.

Plus d'informations

La méthode qui est utilisée dans cet article est celui qui est décrite dans MSDN sous la rubrique WinMain. Il utilise la fonction CreateMutex pour créer un mutex nommé qui peut être vérifiée sur des processus. Au lieu de dupliquer le même code pour chaque application que vous utiliserez comme une instance unique, le code que vous devez posséder est dans une classe wrapper C++ que vous pouvez réutiliser dans chaque application.

Pour utiliser cette fonctionnalité, procédez comme suit :
  1. Créer un nouveau fichier d'en-tête portant le nom LimitSingleInstance.h, puis l'ajouter à votre projet.
  2. Copier le code suivant dans le fichier LimitSingleInstance.h et puis enregistrez le fichier :
    #ifndef LimitSingleInstance_H
    #define LimitSingleInstance_H
    
    #include <windows.h> 
    
    //This code is from Q243953 in case you lose the article and wonder
    //where this code came from.
    class CLimitSingleInstance
    {
    protected:
      DWORD  m_dwLastError;
      HANDLE m_hMutex;
    
    public:
      CLimitSingleInstance(TCHAR *strMutexName)
      {
        //Make sure that you use a name that is unique for this application otherwise
        //two apps may think they are the same if they are using same name for
        //3rd parm to CreateMutex
        m_hMutex = CreateMutex(NULL, FALSE, strMutexName); //do early
        m_dwLastError = GetLastError(); //save for use later...
      }
       
      ~CLimitSingleInstance() 
      {
        if (m_hMutex)  //Do not forget to close handles.
        {
           CloseHandle(m_hMutex); //Do as late as possible.
           m_hMutex = NULL; //Good habit to be in.
        }
      }
    
      BOOL IsAnotherInstanceRunning() 
      {
        return (ERROR_ALREADY_EXISTS == m_dwLastError);
      }
    };
    #endif
    					
    Remarque dans Visual C++ 2005, vous devez ajouter l'option compilateur commun langue runtime prise en charge (/ clr:oldSyntax) pour compiler avec succès l'exemple de code précédent. Pour ajouter l'option langue runtime prise en charge compilateur courantes, procédez comme suit :
    1. Cliquez sur le projet , puis cliquez sur Propriétés ProjectName.

      note ProjectName est un espace réservé pour le nom du projet.
    2. Développez les propriétés de configuration , puis cliquez sur général .
    3. Dans le volet droit, cliquez pour sélectionner Common Language Runtime Support, l'ancienne syntaxe (/ clr:oldSyntax) dans le Common Language Runtime prend en charge les paramètres de projets.
    4. Cliquez sur Appliquer , puis cliquez sur OK .
    Pour plus d'informations courantes langue exécution prise en charge des options du compilateur, reportez-vous au site de Web MSDN (Microsoft Developer Network) suivant :
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  3. # inclure le fichier LimitSingleInstance.h où se trouve le point entrée du programme. Si cela ne doit être utilisé dans une application MFC, il est le fichier où la fonction InitInstance() pour l'application est située. Dans un SDK Win32 application, il est où se trouve la fonction WinMain() . Dans une application de console, il est où se trouve la fonction main() .
    #include "LimitSingleInstance.H"
    					
  4. Créer une instance globale de la classe CLimitSingleInstance avant la fonction de point d'entrée. Si cela est utilisé dans une application MFC, créer l'instance avant la fonction InitInstance() .
  5. Transmettez un nom unique au constructeur de l'instance CLimitSingleInstance global. Il est recommandé d'utiliser un nom unique pour une autre application qui peut-être utiliser cet article n'entre pas en conflit lors de la vérification des doublons. Pour obtenir un nom unique qui personne d'autre aura facilement consiste à utiliser l'outil GUIDGEN. Pour accéder à l'outil, cliquez sur Démarrer , cliquez sur Exécuter et tapez GUIDGEN . Si pour une raison quelconque, vous n'avez pas l'outil, l'outil est fourni comme échantillon dans MSDN. Type GUIDGEN dans l'index MSDN pour le trouver. Assurez-vous que vous utilisez l'option formatage du Registre dans le GUIDGEN outil.
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    // Change what is passed to constructor. GUIDGEN Tool may be of help.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
    					
  6. Dans votre entrée point fonction, appelez la méthode IsAnotherInstanceRunning() sur l'instance de la classe CLimitSingleInstance globale et vérifier la valeur de retour. Si la fonction renvoie la valeur TRUE, renvoyer à partir de la fonction de point d'entrée. Sinon, passez l'exécution comme d'habitude.

    Dans une application MFC, vous pouvez effectuer similaire à la suivante :
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{05CA3573-B449-4e0b-83F5-7FD612E378E9}"));
    
    BOOL CSingleInstDlg5App::InitInstance()
    {
        if (g_SingleInstanceObj.IsAnotherInstanceRunning())
           return FALSE; 
    
    //Rest of code.
    }
    						
    dans une application de console, vous pouvez effectuer une opération semblable au suivant :
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{9DA0BEED-7248-450a-B27C-C0409BDC377D}"));
    
    int main(int argc, char* argv[])
    {
        if (g_SingleInstanceObj.IsAnotherInstanceRunning())
           return 0;
    //Rest of code.
    }
    						
    dans un kit de développement logiciel (SDK) application Win32, vous pouvez effectuer quelque chose de similaire les actions suivantes :
    #include "LimitSingleInstance.H"
    
    // The one and only CLimitSingleInstance object.
    CLimitSingleInstance g_SingleInstanceObj(TEXT("Global\\{2194ABA1-BFFA-4e6b-8C26-D191BB16F9E6}"));
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int cmdShow)
    {
        if (g_SingleInstanceObj.IsAnotherInstanceRunning())
           return FALSE; 
    //Rest of code.
    }
    						
Après avoir suivi ces étapes, l'application n'autorise pas plusieurs instances reste active en même temps.

note Lorsque exécute les services Terminal Server, ne pas l'ajoutez que Global\ assureront une instance par session des services Terminal Server.
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
Ajout « Global\ » ne garantit qu'il n'est qu'une seule instance de l'application sur un ordinateur. Cela s'applique si les services Terminal Server exécute ou pas.

Références

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
238100 Comment limiter les applications MFC SDI 32 bits à une instance unique dans WinCE

Propriétés

Numéro d'article: 243953 - Dernière mise à jour: lundi 9 janvier 2006 - Version: 7.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Initiation
  • Microsoft Visual C++ .NET 2002 Initiation
  • Microsoft Visual C++ 6.0 Édition Professionnelle
  • Microsoft Visual C++ 6.0 Édition Entreprise
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ 5.0 Édition Professionnelle
  • Microsoft Visual C++ 5.0 Édition Entreprise
  • Microsoft Visual C++ 4.2 Édition Professionnelle
  • Microsoft Visual C++ 4.2 Édition Entreprise
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 4.0 Édition Standard
Mots-clés : 
kbmt kbinfo kbhowto kbuidesign KB243953 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 243953
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com