Cómo limitar aplicaciones de 32 bits a una instancia en C++

Seleccione idioma Seleccione idioma
Id. de artículo: 243953 - Ver los productos a los que se aplica este artículo
Nota Microsoft Visual C++ 2005, Visual C++ .NET 2003 y Visual C++ .NET 2002 admiten tanto el modelo de código administrado suministrada por Microsoft .NET Framework y el modelo de código nativo no administrado de Microsoft Windows. La información de este artículo sólo se aplica al código no administrado de Visual C++.
Expandir todo | Contraer todo

Resumen

Se explica cómo limitar una aplicación a una instancia. El método que se utiliza en este artículo no dependa de cualquier creación de ventanas. Por lo tanto, el método puede utilizarse para limitar una aplicación a una instancia que se desarrolla en C++. Esto incluye aplicaciones de consola, aplicaciones de WinCE, diálogo cuadro a partir de aplicaciones, aplicaciones sin una interfaz gráfica de usuario y otras aplicaciones.

Más información

El método que se utiliza en este artículo es el que se describe en MSDN en el tema de WinMain. Utiliza la función CreateMutex para crear una exclusión mutua con nombre que pueda protegerse entre procesos. En lugar de duplicar el mismo código para cada aplicación que se utilizará como una sola instancia, el código que debe tener está en una clase de contenedor de C++ que puede reutilizar en cada aplicación.

Para utilizar esta funcionalidad, siga estos pasos:
  1. Crear un nuevo archivo de encabezado con el nombre LimitSingleInstance.h y agréguelo al proyecto.
  2. Copie el código siguiente al archivo LimitSingleInstance.h y, a continuación, guarde el archivo:
    #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 en Visual C++ 2005, debe agregar la opción de compilador de common language runtime soporte (/ CLR: oldSyntax) para compilar correctamente el ejemplo de código anterior. Para agregar la opción de compilador de compatibilidad de common language runtime, siga estos pasos:
    1. Haga clic en proyecto y, a continuación, haga clic en propiedades ProjectName.

      Nota ProjectName es un marcador de posición para el nombre del proyecto.
    2. Expanda Propiedades de configuración y, a continuación, haga clic en General .
    3. En el panel derecho, haga clic para seleccionar compatible con Common Language Runtime, sintaxis antigua (/ CLR: oldSyntax) en Common Language Runtime admite la configuración del proyecto.
    4. Haga clic en Aplicar y, a continuación, haga clic en Aceptar .
    Para obtener más información acerca de las opciones del compilador de compatibilidad con common language runtime, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  3. # incluir el archivo de LimitSingleInstance.h donde se encuentra el punto entrada del programa. Si es para utilizarse en una aplicación MFC, es el archivo donde se encuentra la función InitInstance() para la aplicación. En un SDK de Win32 aplicación, es donde la función WinMain() está ubicada. En una aplicación de consola es donde se encuentra la función main() .
    #include "LimitSingleInstance.H"
    					
  4. Crear una instancia global de la clase CLimitSingleInstance antes de la función de punto de entrada. Si se utiliza en una aplicación MFC, crear la instancia antes de la función InitInstance() .
  5. Pase un nombre único al constructor de la instancia CLimitSingleInstance global. Se recomienda utilizar un nombre único para que otra aplicación que se puede utilizar en este artículo no entre en conflicto al realizar la comprobación de duplicados. Una manera fácil de obtener un nombre único que nadie más tendrá es utilizar la herramienta GUIDGEN. Para tener acceso a la herramienta, haga clic en Inicio , haga clic en Ejecutar y, a continuación, escriba GUIDGEN . Si por alguna razón no tiene la herramienta, la herramienta se proporciona como un ejemplo en MSDN. Tipo GUIDGEN en el índice MSDN para encontrarlo. Asegúrese de utilizar la opción de Formato de registro en el GUIDGEN herramienta.
    #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. En la entrada de función de punto, llame al método IsAnotherInstanceRunning() en la instancia global de la clase CLimitSingleInstance y comprobar el valor devuelto. Si la función devuelve TRUE, devolver desde la función de punto de entrada. En caso contrario, continuar la ejecución como normal.

    En una aplicación MFC, puede hacer algo similar al siguiente:
    #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.
    }
    						
    en una aplicación de consola, puede hacer algo similar al siguiente:
    #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.
    }
    						
    en un SDK aplicación Win32, puede hacer algo similar lo siguiente:
    #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.
    }
    						
Después de seguir estos pasos, la aplicación no permitirá que varias instancias de permanecen activas al mismo tiempo.

Nota Cuando se ejecuta bajo Servicios de Terminal Server, no agregando que Global\ garantizará una instancia por sesión de servicios de Terminal Server.
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
agregar "Global\" garantizará que hay sólo una instancia de la aplicación en un equipo. Esto se aplica si Servicios de Terminal Server se está ejecutando o no.

Referencias

Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
238100Cómo limitar las aplicaciones SDI de MFC de 32 bits a una sola instancia en WinCE

Propiedades

Id. de artículo: 243953 - Última revisión: lunes, 09 de enero de 2006 - Versión: 7.0
La información de este artículo se refiere a:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard
  • Microsoft Visual C++ .NET 2002 Standard
  • Microsoft Visual C++ 6.0 Professional
  • Microsoft Visual C++ 6.0 Enterprise
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ 5.0 Professional
  • 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
Palabras clave: 
kbmt kbinfo kbhowto kbuidesign KB243953 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 243953

Enviar comentarios

 

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