Código
Seria ideal se pudéssemos limitar o número de vezes que um aplicativo pode estar ativo na memória. Em alguns casos, dependendo do programa desenvolvido, é realmente necessário limitar a uma instância, somente. Veremos neste artigo como detectar se outro aplicativo já está rodando e como restaurar a outra instância do programa, caso esteja minimizada.
O Erro comum
Na mesma velocidade em que a linguagem Delphi se propagou, inúmeros sites da Internet foram criados, contendo informações técnicas sobre Delphi. Hoje é possível consultar centenas de sites, alguns deles com dicas desatualizadas desde 1996. Portanto tome cuidado com as informações lá obtidas. A primeira versão do Delphi foi originalmente criada para rodar no Windows 3.11, um ambiente 16 bits, com inúmeras diferenças do ambiente do Windows 9x / NT / 2000.
Muitas dicas encontradas apresentam uma solução aparentemente simples: verificar o conteúdo de hPrevInst. Se o valor for diferente de zero, então o aplicativo já está rodando, e pode-se abortar a execução do programa. Só que no ambiente Win32, o valor de hPrevInst será sempre zero.
Criando um Mutex
Mutex é um objeto de sincronização que contém um indicador para sinalizar quando ele pertence a um processo, e não sinalizado quando não existir nenhum processo. Somente um processo por vez pode requisitar um objeto mutex. Isto é útil para podermos coordenar exclusivos acessos a um recurso compartilhado. Por exemplo, para prevenir que dois processos gravem em uma mesma área de memória compartilhada, ao mesmo tempo. Podemos então utilizar esta mesma técnica, só que para verificar se algum aplicativo já é dono de um determinado mutex.
Neste exemplo utilizaremos a função CreateMutex para criar o objeto de sincronização.
O exemplo seguinte utiliza a função CreateMutex para criar um mutex, e caso não seja possível a criação, cancela a execução do programa. Esta função requer três parâmetros: o primeiro lpMutexAttributes iremos passar NULL; o segundo bInitialOwner indica se o processo que está criando deve ser o dono incial do objeto; o terceiro lpName é o nome único, para todo o sistema, que deveremos associar ao objeto. Caso ocorra um erro na criação do mutex, é porque este programa já esta sendo executado, então a função Halt() é chamada para finalizar a execução deste processo.}
procedure TForm1.FormCreate(Sender: TObject);
begin
//cria um mutex usando um nome único
CreateMutex(nil, False, 'SoftCast.OnlyOne');
//verifica se houve erro na criação
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, 'Este programa já está sendo executado’,
'Aviso', MB_ICONSTOP);
Halt(0); // cancela execução
end;
end;
Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009