Como limitar as aplicações de 32 bits para uma instância no Visual C++

Traduções de Artigos Traduções de Artigos
Artigo: 243953 - Ver produtos para os quais este artigo se aplica.
Nota Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 e Microsoft Visual C++ .NET 2002 suportam o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e o modelo de código do Microsoft Windows nativo não gerido. As informações neste artigo aplicam-se apenas ao código de Visual C++ não gerido.
Expandir tudo | Reduzir tudo

Sumário

Este artigo descreve como limitar uma aplicação a uma instância. O método utilizado neste artigo não depende de qualquer criação das janelas. Por conseguinte, o método pode ser utilizado para limitar uma aplicação a uma instância desenvolvida em Visual C++. Isto inclui aplicações da consola, WinCE aplicações, diálogo caixa com aplicações, aplicações sem uma interface gráfica de utilizador e outras aplicações.

Mais Informação

O método utilizado neste artigo é aquele que é descrita na MSDN em tópico WinMain. Utiliza a função CreateMutex para criar uma exclusão mútua nomeada que pode ser verificada nos vários processos. Em vez de duplicar o mesmo código para cada aplicação que irá utilizar como uma única instância, o código que tem de ter é uma classe de wrapper C++ que pode reutilizar em cada aplicação.

Para utilizar esta funcionalidade, siga estes passos:
  1. Criar um novo ficheiro de cabeçalho com o nome LimitSingleInstance.h e, em seguida, adicione-o projecto.
  2. Copie o seguinte código para o ficheiro LimitSingleInstance.h e, em seguida, guarde o ficheiro:
    #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: no Visual C++ 2005, terá de adicionar a opção de compilador do suporte de tempo de execução idioma comum (/ clr:oldSyntax) para compilar com êxito o anterior exemplo de código. Para adicionar a opção de compilador do suporte de tempo de execução idioma comum, siga estes passos:
    1. Clique em projecto e, em seguida, clique em propriedades ProjectName.

      Nota ProjectName é um marcador para o nome do projecto.
    2. Expanda Propriedades de configuração e, em seguida, clique em Geral .
    3. No painel direito, clique para seleccionar Runtime do idioma comum suporte, sintaxe antigo (/ clr:oldSyntax) no Common Language Runtime suporta definições do projecto.
    4. Clique em Aplicar e, em seguida, clique em OK .
    Para obter mais informações sobre as opções de compilador do suporte de tempo de execução idioma comum, visite o seguinte Web site da Microsoft Developer Network (MSDN):
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  3. # incluir o ficheiro LimitSingleInstance.h onde está localizado o ponto de entrada do programa. Se esta deve ser utilizado numa aplicação MFC, é o ficheiro onde a função InitInstance() para a aplicação está localizada. No Win32 SDK aplicação, é onde está localizada a função WinMain() . Numa aplicação de consola, é onde está localizada a função main() .
    #include "LimitSingleInstance.H"
    					
  4. Crie uma instância da classe CLimitSingleInstance antes da função de ponto de entrada global. Se estiver a ser utilizado numa aplicação MFC, crie a instância antes da função InitInstance() .
  5. Passe um nome exclusivo para o Construtor de instância CLimitSingleInstance global. Recomenda-se que utilize um nome exclusivo para que outra aplicação que possam estar a utilizar este artigo não irá em conflito quando efectuar a verificação duplicados. Uma forma fácil de obter um nome exclusivo que mais ninguém terá consiste em utilizar a ferramenta GUIDGEN. Para aceder à ferramenta, clique em Iniciar , clique em Executar e, em seguida, escreva GUIDGEN . Se por algum motivo não tiver a ferramenta, a ferramenta é fornecida como um exemplo na MSDN. Escreva GUIDGEN no índice da MSDN para localizá-lo. Certifique-se que utiliza a opção de Formato de registo no GUIDGEN ferramenta.
    #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. Na sua entrada aponte função, chamar o método IsAnotherInstanceRunning() na instância da classe CLimitSingleInstance global e verifique o valor devolvido. Se a função devolve VERDADEIRO, devolver da função de ponto de entrada. Caso contrário, continue a execução como normal.

    Numa aplicação MFC, que pode fazer algo semelhante à seguinte:
    #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.
    }
    						
    numa consola de aplicações, que pode fazer algo semelhante à seguinte:
    #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.
    }
    						
    num Win32 SDK liquidação, pode fazer algo semelhante o seguinte:
    #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.
    }
    						
Depois de seguir estes passos, a aplicação não permite mais do que uma instância permaneçam activas ao mesmo tempo.

Nota Quando executar os serviços de terminal, não adicionar que Global\ irá garantir uma instância por sessão dos serviços de terminal.
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
adicionar "Global\" irá garantir que existe apenas uma instância da aplicação num computador. Isto aplica-se com os serviços de terminal ou não.

Referências

Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
238100Como limitar as aplicações de MFC SDI de 32 bits para uma única instância no WinCE

Propriedades

Artigo: 243953 - Última revisão: 9 de janeiro de 2006 - Revisão: 7.0
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbmt kbinfo kbhowto kbuidesign KB243953 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 243953

Submeter comentários

 

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