Come limitare le applicazioni a un'istanza di Visual c ++ a 32 bit

Traduzione articoli Traduzione articoli
Identificativo articolo: 243953 - Visualizza i prodotti a cui si riferisce l?articolo.
Nota Microsoft Visual c ++ 2005, Microsoft Visual c ++ .NET 2003 e Microsoft Visual c ++ .NET 2002 supportano sia il modello di codice gestito fornito da Microsoft .NET Framework che il modello di codice non gestito nativo di Microsoft Windows. Le informazioni contenute in questo articolo si applicano solo al codice Visual C++ non gestito.
Espandi tutto | Chiudi tutto

Sommario

In questo articolo viene descritto come limitare una sola istanza di un'applicazione. Il metodo che viene utilizzato in questo articolo non si basa sulla qualsiasi creazione di finestre. Di conseguenza, il metodo pu˛ essere utilizzato per limitare un'applicazione a un'istanza Ŕ stata sviluppata in Visual c ++. Sono inclusi le applicazioni console, applicazioni WinCE, finestra di dialogo casella basata delle applicazioni, applicazioni senza un'interfaccia utente grafica e altre applicazioni.

Informazioni

Il metodo che viene utilizzato in questo articolo Ŕ quello descritto nell'argomento WinMain in MSDN. Utilizza la funzione CreateMutex per creare un mutex denominato che pu˛ essere archiviato nei processi. AnzichÚ duplicare lo stesso codice per ogni applicazione che verrÓ utilizzato come una singola istanza, il codice che occorre Ŕ in una classe di wrapper di c ++ Ŕ possibile riutilizzare in ogni applicazione.

Per utilizzare questa funzionalitÓ, attenersi alla seguente procedura:
  1. Creare un nuovo file di intestazione con il nome LimitSingleInstance.h e quindi aggiungerlo al progetto.
  2. Copiare il codice riportato di seguito il file LimitSingleInstance.h e quindi salvare il file:
    #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
    					
    Nota In Visual c ++ 2005, in cui Ŕ necessario aggiungere l'opzione del compilatore supporto di common language runtime (/ CLR: oldSyntax) per compilare correttamente l'esempio di codice precedente. Per aggiungere il compilatore opzione supporto common language runtime, attenersi alla seguente procedura:
    1. Fare clic su progetto e quindi fare clic su proprietÓ ProjectName.

      Nota ProjectName Ŕ un segnaposto per il nome del progetto.
    2. Espandere la ProprietÓ di configurazione e quindi fare clic su Generale .
    3. Nel riquadro destro, fare clic su per selezionare supporto Common Language Runtime, vecchia sintassi (/ CLR: oldSyntax) in Common Language Runtime supporta le impostazioni del progetto.
    4. Fare clic su Applica e quindi fare clic su OK .
    Per ulteriori informazioni sulle common language runtime opzioni di supporto del compilatore, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  3. # include file LimitSingleInstance.h in cui Ŕ posizionato il punto di ingresso del programma. Se questa deve essere utilizzato in un'applicazione MFC, Ŕ il file in cui si trova la funzione InitInstance() per l'applicazione. In un SDK dell'applicazione Ŕ in cui Ŕ disponibile la funzione WinMain() . In un'applicazione console, Ŕ in cui si trova la funzione main() .
    #include "LimitSingleInstance.H"
    					
  4. Creare un'istanza globale della classe CLimitSingleInstance prima la funzione del punto di ingresso. Se questo viene utilizzato in un'applicazione MFC, Ŕ necessario creare l'istanza prima della funzione InitInstance() .
  5. Passare al costruttore dell'istanza CLimitSingleInstance globale di un nome univoco. Si consiglia di utilizzare un nome univoco in modo che un'altra applicazione stia utilizzando questo articolo non sarÓ in conflitto quando si esegue la verifica dei duplicati. Un modo semplice per ottenere un nome univoco che nessun altro avrÓ consiste la utilizzare lo strumento GUIDGEN. Per accedere allo strumento, fare clic su Start , scegliere Esegui e digitare GUIDGEN . Se per qualche motivo non Ŕ lo strumento, lo strumento viene fornito un esempio in MSDN. Tipo GUIDGEN nell'indice MSDN per individuarlo. Assicurarsi di utilizzare l'opzione Formato del registro in di GUIDGEN strumento.
    #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. Durante l'immissione funzione di punto, chiamare il metodo di IsAnotherInstanceRunning() l'istanza globale della classe CLimitSingleInstance e controllare il valore restituito. Se la funzione restituisce TRUE, restituire dalla funzione del punto di ingresso. In caso contrario, continuare l'esecuzione come di consueto.

    In un'applicazione MFC, Ŕ possibile eseguire qualcosa di simile al seguente:
    #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 un'applicazione console, Ŕ possibile eseguire qualcosa di simile al seguente:
    #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 un SDK applicazione Win32, Ŕ possibile eseguire qualcosa di simile le operazioni seguenti:
    #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.
    }
    						
Dopo aver seguito questi passaggi, l'applicazione non consentirÓ pi¨ istanze di rimanere attivo nello stesso momento.

Nota Quando si esegue in Servizi Terminal, aggiunta non che Global\ garantirÓ un'istanza per ogni sessione di Servizi Terminal.
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
aggiunta "Global\" garantirÓ che Ŕ presente una sola istanza dell'applicazione in un computer. Questo si applica se Servizi Terminal Ŕ in esecuzione o non.

Riferimenti

Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
238100Come limitare le applicazioni SDI di MFC a 32 bit a una singola istanza di WinCE

ProprietÓ

Identificativo articolo: 243953 - Ultima modifica: lunedý 9 gennaio 2006 - Revisione: 7.0
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi:á
kbmt kbinfo kbhowto kbuidesign KB243953 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 243953
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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