Zum Begrenzen von 32-Bit-Anwendungen zu einer Instanz in Visual C++

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 243953 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Hinweis: Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 und Microsoft Visual C++ .NET 2002 unterstützen das verwaltete Codemodell, das von Microsoft .NET Framework bereitgestellt wird und nicht verwaltete systemeigene Microsoft Windows-Codemodell. Die Informationen in diesem Artikel beziehen sich nur auf nicht verwalteten Visual C++-Code.
Alles erweitern | Alles schließen

Zusammenfassung

Dieser Artikel beschreibt eine Anwendung eine Instanz beschränken. Die Methode, die in diesem Artikel verwendet wird nicht auf Erstellung von Windows verlassen. Daher kann die Methode verwendet werden, um eine Anwendung eine Instanz beschränken, die in Visual C++ entwickelt wird. Dazu gehören Konsolenanwendungen, Anwendungen WinCE, Dialogfeld im Feld Grundlage Anwendungen, Anwendungen ohne eine grafische Benutzeroberfläche und andere Anwendungen.

Weitere Informationen

Die Methode, die in diesem Artikel verwendet, wird, die in MSDN unter dem Thema WinMain beschrieben ist. Es wird die CreateMutex -Funktion verwendet, einen benannten Mutex zu erstellen, der über Prozesse überprüft werden können. Ist statt duplizieren den gleichen Code für jede Anwendung, die Sie als eine einzelne Instanz verwenden, der Code, die Sie benötigen, in einer C++-Wrapper-Klasse, die Sie über jede Anwendung wiederverwenden können.

Gehen Sie folgendermaßen vor um diese Funktionalität zu verwenden,
  1. Erstellen Sie eine neue Headerdatei mit dem Namen LimitSingleInstance.h, und dann Ihrem Projekt hinzufügen.
  2. Kopieren Sie den folgenden Code in die Datei LimitSingleInstance.h und speichern Sie die Datei:
    #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
    					
    Hinweis In Visual C++ 2005 müssen Sie die common Language Common Language Runtime Unterstützung Compiler-Option (/ CLR: oldSyntax) um das vorherige Codebeispiel erfolgreich zu kompilieren. Gehen Sie folgendermaßen vor um die common Language Common Language Runtime Unterstützung-Compileroption hinzuzufügen,
    1. Klicken Sie auf Projekt , und klicken Sie dann auf ProjectName Eigenschaften .

      Hinweis: ProjectName ist ein Platzhalter für den Namen des Projekts.
    2. Erweitern Sie Konfiguration , und klicken Sie dann auf Allgemein .
    3. Klicken Sie im rechten Fensterbereich auf Common Language Runtime-Unterstützung, alte Syntax (/ CLR: oldSyntax) in der Common Language Runtime-Unterstützung Projekteinstellungen.
    4. Klicken Sie auf Übernehmen , und klicken Sie dann auf OK .
    Weitere Informationen über die common Language Runtime Unterstützung Compileroptionen der folgenden Microsoft Developer Network (MSDN)-Website:
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  3. # include LimitSingleInstance.h Datei, in der Einstiegspunkt der Anwendung befindet. Dies ist in einer MFC-Anwendung verwendet werden, ist die Datei die InitInstance() -Funktion für die Anwendung. In einem Win32-SDK Anwendung, es ist, in dem die Funktion WinMain() befindet. In einer Konsolenanwendung ist es, in dem sich die main() -Funktion befindet.
    #include "LimitSingleInstance.H"
    					
  4. Erstellen Sie eine globale Instanz der CLimitSingleInstance -Klasse, bevor Sie die EntryPoint-Funktion. Wenn dies in einer MFC-Anwendung verwendet wird, erstellen Sie die Instanz vor der InitInstance() -Funktion.
  5. Übergeben Sie einen eindeutigen Namen an den Konstruktor der globalen Instanz der CLimitSingleInstance . Es wird empfohlen, einen eindeutigen Namen, verwenden damit eine andere Anwendung, die in diesem Artikel verwendet werden kann nicht in Konflikt wird bei der Duplikatenprüfung. Eine einfache Möglichkeit um einen eindeutigen Namen abzurufen, den Niemand sonst hat, besteht das GUIDGEN-Tool verwenden. Um das Tool zuzugreifen, klicken Sie auf Start , klicken Sie auf Ausführen und geben Sie GUIDGEN . Wenn aus irgendeinem Grund Sie nicht das Tool haben, wird das Tool als Beispiel in MSDN bereitgestellt. Der Typ GUIDGEN in der MSDN-Index gefunden werden. Stellen Sie sicher, dass Sie die Option Registrierungsformat in das GUIDGEN verwenden Tool.
    #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. Zeigen Sie in den Eintrag Funktion, rufen Sie die IsAnotherInstanceRunning() -Methode für die globale Instanz der CLimitSingleInstance -Klasse auf, und überprüfen Sie den Rückgabewert. Wenn die Funktion TRUE zurückgibt, die aus den Eintrag Punkt-Funktion rückgegeben Sie werden . Andernfalls fahren Sie als normal ausgeführt.

    In einer MFC-Anwendung können Sie ähnlich dem folgenden:
    #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.
    }
    						
    in einer Konsolenanwendung, können Sie ähnlich dem folgenden:
    #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.
    }
    						
    in einem Win32-SDK Anwendung, können Sie ähnlich die folgenden:
    #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.
    }
    						
Nach diesen Schritten, lässt die Anwendung nicht mehr als eine Instanz gleichzeitig aktiv bleiben.

Hinweis: Wenn unter Terminaldiensten ausgeführt wird, hinzugefügt nicht Global\ eine Instanz pro Terminaldienste-Sitzung gewährleistet wird.
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
hinzufügen "Global\" wird sichergestellt, dass nur eine Instanz der Anwendung auf einem Computer vorhanden ist. Dies gilt, ob Terminaldienste oder nicht ausgeführt wird.

Informationsquellen

Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
23810032-Bit-MFC SDI Anwendungen auf eine einzelne Instanz auf WinCE beschränken

Eigenschaften

Artikel-ID: 243953 - Geändert am: Montag, 9. Januar 2006 - Version: 7.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 4.2 Professional Edition
  • Microsoft Visual C++ 4.2 Enterprise Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 4.0 Standard Edition
Keywords: 
kbmt kbinfo kbhowto kbuidesign KB243953 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 243953
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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