Jak omezit 32bitové aplikace jedné instance v jazyce C++

Překlady článku Překlady článku
ID článku: 243953 - Produkty, které se vztahují k tomuto článku.
Poznámka: Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 a Microsoft Visual C++ .NET 2002 podporují model spravovaný kód, který je součástí Microsoft .NET Framework a Nespravovaná nativní kód modelu Microsoft Windows. Informace v tomto článku platí pouze pro nespravované kód jazyka C++.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Souhrn

Tento článek popisuje, jak omezit aplikace jedné instance. Metoda používaná v tomto článku není závislý na jakékoli vytváření windows. Proto metoda lze omezit aplikace jedné instance vyvinutých v jazyce C++. To zahrnuje aplikace konzoly, WinCE aplikací, dialogové okno pole založené aplikací aplikace bez grafické uživatelské rozhraní a jiných aplikací.

Další informace

Metoda používaná v tomto článku je popsaný v MSDN pod téma WinMain. Funkce CreateMutex funkce se použije k vytvoření pojmenované mutex, které lze zkontrolovat v rámci procesů. Namísto duplikování stejný kód pro každou aplikaci používající jako jediná instance kód musí mít je třídy C++ obálky, můžete znovu použít přes každé aplikace.

Chcete-li použít tuto funkci, postupujte takto:
  1. Vytvořit nový soubor záhlaví s názvem LimitSingleInstance.h a pak přidejte do projektu.
  2. Zkopírujte následující kód do souboru LimitSingleInstance.h a uložte soubor:
    #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
    					
    Poznámka V Visual C++ 2005, musíte přidat možnost kompilátoru podporu runtime běžné jazyk (/ clr:oldSyntax) úspěšně zkompilovat předchozí ukázkový kód. Přidat možnost kompilátoru podporu runtime běžné jazyk, postupujte takto:
    1. Klepněte na tlačítko projekt a klepněte na příkaz vlastnosti ProjectName.

      Poznámka:ProjectName je zástupný název projektu.
    2. Rozbalte položku Konfigurace vlastnosti a potom klepněte na položku Obecné.
    3. V pravém podokně klepnutím vyberte Common Language Runtime podpory, staré syntaxe (/ clr:oldSyntax) v Common Language Runtime podporují nastavení projektu.
    4. Klepněte na tlačítko použít a potom klepněte na tlačítko OK.
    Další informace o běžné možnosti kompilátoru jazyka runtime podpory na webu Microsoft Developer Network (MSDN):
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  3. # include souboru LimitSingleInstance.h, kde je umístěn vstupní bod program. Pokud je to používané v aplikaci MFC, je soubor funkce InitInstance() aplikace. V Win32 SDK aplikace je WinMain() funkce, která je umístěna. V aplikaci konzoly je main() funkce, která je umístěna.
    #include "LimitSingleInstance.H"
    					
  4. Vytvořit globální instance třídy CLimitSingleInstance před funkci vstupního bodu. Pokud se používá v aplikaci MFC, vytvořit instanci před funkce InitInstance().
  5. Předat konstruktor instance CLimitSingleInstance globální jedinečný název. Je doporučeno použít jedinečný název, takže jiné aplikace, které mohou používat tento článek není konfliktu při provádění kontroly duplicitní. Snadno získat jedinečný název, který bude mít nikdo jiný je pomocí nástroje GUIDGEN. Přístup k nástroji, klepněte na tlačítko Start, klepněte na příkaz Spustit a zadejte GUIDGEN. Pokud z nějakého důvodu nemáte nástroj, nástroj je poskytován jako vzorek MSDN. Typ GUIDGEN v indexu MSDN ji najít. Zkontrolujte, zda použít možnost Formátování registru v GUIDGEN nástroj.
    #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. V položce vaše přejděte funkce volání metody IsAnotherInstanceRunning() na globální instance třídy CLimitSingleInstance a zkontrolujte vrácená hodnota. Pokud funkce vrátí hodnotu PRAVDA, vrátit z funkci vstupního bodu. Jinak pokračujte spuštění jako normální.

    V aplikaci MFC můžete provést něco podobná následující:
    #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 aplikace konzoly můžete provést něco podobná následující:
    #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 Win32 SDK aplikace, můžete provést podobnou následující:
    #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.
    }
    						
Po následujících kroků, neumožní aplikace více než jedné instance zůstávají aktivní současně.

Poznámka: Při spuštěné pod Terminálové přidávání není Global\ zaručí jednu instanci za relace Terminálové.
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
Přidání "Global\" zaručí, že je pouze jedna instance aplikace v počítači. To platí, zda je spuštěna Terminálová či nikoli.

Odkazy

Další informace naleznete následujícím článku znalostní databáze Microsoft Knowledge Base:
238100Jak omezit 32bitové aplikace MFC SDI do jedné instance v WinCE

Vlastnosti

ID článku: 243953 - Poslední aktualizace: 9. ledna 2006 - Revize: 7.0
Informace v tomto článku jsou určeny pro produkt:
  • 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
Klíčová slova: 
kbmt kbinfo kbhowto kbuidesign KB243953 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:243953

Dejte nám zpětnou vazbu

 

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