Como limitar os aplicativos de 32 bits em uma ocorrência no Visual C++

Traduções deste artigo Traduções deste artigo
ID do artigo: 243953 - Exibir os produtos aos quais esse artigo se aplica.
Observação Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 e Microsoft Visual C++ .NET 2002 oferecem suporte o modelo de código gerenciado fornecido pelo Microsoft .NET Framework e o modelo de código do Windows de Microsoft nativo não gerenciado. As informações neste artigo se aplicam somente ao código do Visual C++ não gerenciado.
Expandir tudo | Recolher tudo

Sumário

Este artigo descreve como limitar um aplicativo a uma instância. O método que é usado neste artigo não depende de qualquer criação do windows. Portanto, o método pode ser usado para limitar a um aplicativo a uma instância é desenvolvido no Visual C++. Isso inclui aplicativos de console, aplicativos WinCE, diálogo caixa com base em aplicativos, aplicativos sem uma interface gráfica do usuário e outros aplicativos.

Mais Informações

O método que é usado neste artigo é o que é descrito na MSDN em tópico WinMain. Ele usa a função CreateMutex para criar um mutex nomeado que pode ser verificado entre processos. Em vez de duplicar o mesmo código para cada aplicativo que você usará como uma única instância, o código que você deve ter está em uma classe de wrapper do C++ que você pode reutilizar em cada aplicativo.

Para usar esta funcionalidade, execute essas etapas:
  1. Criar um novo arquivo de cabeçalho com o nome LimitSingleInstance.h e adicione-o para seu projeto.
  2. Copiar o código a seguir para o arquivo LimitSingleInstance.h e, em seguida, salve o arquivo:
    #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
    					
    Observação Visual C++ 2005, você deve adicionar a opção de compilador de suporte de tempo de execução idioma comum (/ CLR: oldSyntax) para compilar o exemplo de código anterior com êxito. Para adicionar a opção de compilador de suporte de tempo de execução idioma comum, siga estas etapas:
    1. Clique em projeto e, em seguida, clique em propriedades ProjectName.

      Observação ProjectName é um espaço reservado para o nome do projeto.
    2. Expanda Configuration Properties e, em seguida, clique em Geral .
    3. No painel direito, clique para selecionar Common Language Runtime suporte, sintaxe antiga (/ CLR: oldSyntax) nas configurações de projeto oferece suporte a Common Language Runtime .
    4. Clique em Aplicar e, em seguida, clique em OK .
    Para obter mais informações sobre as opções comuns de compilador do suporte de tempo de execução do idioma, visite o seguinte site da Web Microsoft Developer Network (MSDN):
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
  3. # incluem o arquivo LimitSingleInstance.h encontra o ponto de entrada do programa. Se esta for a ser usado em um aplicativo MFC, ele é o arquivo onde a função InitInstance() para o aplicativo está localizada. Em um SDK do Win32 aplicativo, é onde a função WinMain() está localizada. Em um aplicativo de console, é onde está a função main() .
    #include "LimitSingleInstance.H"
    					
  4. Criar uma instância global da classe CLimitSingleInstance antes da função do ponto de entrada. Se isso estiver sendo usado em um aplicativo MFC, crie a instância antes da função InitInstance() .
  5. Passe um nome exclusivo para o construtor da instância CLimitSingleInstance global. É recomendável que você use um nome exclusivo para que o outro aplicativo que possam estar usando este artigo não entrarão em conflito ao fazer a verificação duplicada. Uma maneira fácil de obter um nome exclusivo que ninguém mais terá é usar a ferramenta GUIDGEN. Para acessar a ferramenta, clique em Iniciar , clique em Executar e, em seguida, digite GUIDGEN . Se por algum motivo você não tiver a ferramenta, a ferramenta é fornecida como um exemplo no MSDN. Digite GUIDGEN no índice MSDN para localizá-lo. Verifique se você usar a opção de Formato de registro 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 global da classe CLimitSingleInstance e verifique o valor de retorno. Se a função retornar verdadeiro, retorne da função de ponto de entrada. Caso contrário, continue a execução como normal.

    Em um aplicativo MFC, você 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.
    }
    						
    em um aplicativo de console, você 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.
    }
    						
    em um Win32 SDK aplicativo, você pode fazer algo semelhante a 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 essas etapas, o aplicativo não permitirá que mais de uma instância para permanecem ativas ao mesmo tempo.

Observação Ao executar em serviços de terminal, não adicionando que Global\ garante uma instância por sessão dos serviços de terminal.
   CLimitSingleInstance g_SingleInstanceObj(TEXT("{719967F0-DCC6-49b5-9C61-DE91175C3187}"));
					
adicionar "Global\" garante que há apenas uma instância do aplicativo em um computador. Isso se aplica se os serviços de terminal está executando ou não.

Referências

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
238100Como limitar aplicativos MFC SDI de 32 bits para uma única instância no WinCE

Propriedades

ID do artigo: 243953 - Última revisão: segunda-feira, 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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