O tratamento de múltiplas instâncias do executável é uma praticamuito útil, principalmente quando não queremos que os usuários trabalhem com mais de uma instância de nossas aplicações.
Ja vi muitas gambiarras bizzarras e pouco elegantes para resolver esse problema, neste tutorial vou mostrar uma maneira simples e elegante pare resolver de uma vez por todas esse prblema:
Declare a variável global
var
{...} HMutex: THandle; //Essa variável deve ser GLOBAL
No onCreate do seu form digite o seguinte código
Var
{...} FileName : PChar;
begin
{...}FileName := PChar( ExtractFilePath( Application.Exename ) );
{...} HMutex := createMutex(nil, True, FileName);
{...}if ( HMutex = 0 ) or ( GetLastError = ERROR_ALREADY_EXISTS ) then
{...}{...}raise Exception.Create('O programa já está em execução.');
(* Restante da sua lógica.... *)
end;
No on close
ReleaseMutex( HMutex );
Pronto.
Para saber mais: Exclusão Mútua ( Mutex )
: Win32 Error codes
Pesquise no Blog
terça-feira, 26 de fevereiro de 2008
Evitar múltiplas instâncias do Programa
Postado por
Anônimo
às
22:06
Marcadores: Intermediário
Assinar:
Postar comentários (Atom)
2 comentários:
Olá Hat,
O que exatamente faz esse CreateMutex?
Eu já vi um código mais ou menos no estilo dessem só que para Linux. Ele criava um "arquivo especial" no diretório /tmp e quando fechava ele excluia esse arquivo... O problema é que quando acaba a luz por exemplo, o arquivo não era excluido, e quando reiniciava o pc, o programa não executava mais...
Com esse código que você passou, não corre o risco disso acontecer tb?
Junior, o Mutex é uma variável do tipo MONITOR e não um arquivo.
Não sei exatamente se ele cria algum arquivo, mas eu tenho quase certeza que ele apenas marca a região da memória do formulário em questão e impede que ele seja acessado por mais de um processo.
Postar um comentário