Abrir somente uma vez a aplicação

15/05/2003

15

Se fosse possível alguém me ajudar a resolver esse problema.
Evitar que o usuário abra a aplicação 2 vezes, ou seja, se ele tentar acionar pela 2ª vez a aplicação, o sistema deve dar uma mensagens dizendo que o sistema já está em execução....
Fico no aguardo..
Att.
Carlão


Responder

Post mais votado

16/05/2003

O único método 100¬ seguro é este último, utilizando um mutex. Supondo que o xanatos não conheça mutexes, vou fazer dois comentários sobre o código do comodelphi:

1) O terceiro parâmetro da chamada a CreateMutex é o nome do mutex. Mude-o para algum nome que faça sentido para o seu aplicativo, e que seja pouco provável de ser usado também por outro programa (repare que ele usa o nome da empresa e o nome do programa separados por ponto; é uma boa fórmula).

2) Como está mostrado, o código não desaloca o mutex criado quando detecta que ele outra instância está rodando. Apesar de o mutex já existir, o handle que CreateMutex retorna é único para a sua aplicação e precisa ser destruído com uma chamada a CloseHandle. O código mais correto seria:

var MutexHnd: Cardinal;

...

MutexHnd := CreateMutex(nil, False, ´VertigoTI.Vendas´);
If GetLastError = ERROR_ALREADY_EXISTS Then
Begin
MessageBox(...);
CloseHandle(MutexHnd);
Halt(0);
End;
...

Obs. o mutex também precisa ser destruído caso outra instância do programa não esteja rodando. Pode-se colocar a chamada a CloseHandle no fim do bloco inicial do programa.


-- dcport


Responder

Mais Posts

15/05/2003

Carnette

Executando uma única cópia do aplicativo
Se você quiser executar uma única copia do aplicativo, o código de inicializacao do arquivo fonte do PROJETO pode ser escrito conforme segue:

program Project1;
uses
Forms,
Windows,
Dialogs,
Unit1 in ´Unit1.pas´ ;
{$R *.RES}
Var HprevHist : HWND;
begin
Application.Initialize;
HprevHist := FindWindow(Nil, PChar(´TheProgrammer´));
if HprevHist = 0 then begin
Application.Title := ´TheProgrammer´;
Application.CreateForm(TForm1, Form1);
Application.Run;
end else
MessageDlg(´Você não pode executar outra cópia do aplicativo´, mtInformation, [mbOK], 0);
Com esse código o usuário pode iniciar uma nova copia do aplicativo somente se não houver outra anterior. Caso contrario é exibido uma mensagem para o usuário.


Responder

15/05/2003

By Alemão

var
Hwnd: THandle;
begin
Hwnd := FindWindow(´TxConsultas´, ´EasyList´);
if Hwnd = 0 then
begin
Application.Initialize;
Application.Title := ´Easy List - Celulose Irani´;
Application.CreateForm(TxConsultas, xConsultas);
Application.CreateForm(TxDescricao, xDescricao);
Application.Run;
end
else
begin
MessageDlg (´Este programa já esta sendo executado!!!´,mtinformation,[mbok], 0);
SetForegroundWindow (Hwnd);
end;
end.

tem q ser no DPR.....


Responder

15/05/2003

Comodelphi

Esse código resolve. Simple e rápido.

CreateMutex(nil, False, ´VertigoTI.Vendas´);
If GetLastError = ERROR_ALREADY_EXISTS Then
Begin
MessageBox(0, ´Este programa já está sendo executado.´, ´Vertigo TI´, MB_ICONSTOP);
Halt(0);
End;


Responder

15/05/2003

Xanatos

o unico que funcionou aqui ...foi esse ultimo!


Responder