Para Executar Uma Única Cópia Do Aplicativo

Delphi

25/12/2003

Amigos , Tirei Esta Dica Do Clube. Mas Não Esta Compilando. Alguem Sabe Porque Ou Conhece Outra Maneira De Realizar.
Dica Que Tirei Do Clube :
´Se Voce Quer Executar Uma Única Cópia Do Seu Aplicativo, O Código De
Inicialização Do Arquivo Fonte do PROJETO Pode Ser Inscrito Conforme Segue:´
Begin
if HprevHist = 0 Then
begin
Aplication.CreateForm(TForm1,Form1);
Aplication.Run;
end
else
MessageDlg(´Você Não Pode Executar Outra Cópia DoAplicativo´,
mtInformation,[mbok],0);
end;

Não Compila Porque Diz Que HPREVVIST Não Esta Declarado. Aí Fiquei
a Ver Navios.
Amigos. O Que Pode Estar De Errado :?:


Marco Salles

Marco Salles

Curtidas 0

Respostas

Josinaldo

Josinaldo

25/12/2003

//abra a unit do projeto -> project -> view source

{$R *.res}
//delclare esta variavel neste ponto
VAR Handle: THandle;
//o codigo abaixo verifica se o programa está aberto
begin
Handle := FindWindow(´Nome_formulario´, nil);
if Handle <> 0 Then //já está aberto
begin
application.MessageBox(´O programa já está aberto neste terminal, verifique!!!´, ´ATENÇÃO´,
mb_ok + mb_iconError);
Exit;
end;


GOSTEI 0
Marco Salles

Marco Salles

25/12/2003

//abra a unit do projeto -> project -> view source {$R *.res} //delclare esta variavel neste ponto VAR Handle: THandle; //o codigo abaixo verifica se o programa está aberto begin Handle := FindWindow(´Nome_formulario´, nil);// if Handle <> 0 Then //já está aberto begin application.MessageBox(´O programa já está aberto neste terminal, verifique!!!´, ´ATENÇÃO´, mb_ok + mb_iconError); Exit; end;

Obrigado Josinaldo. Mas Estou Na Dúvida No Trecho:´Nome _Formulario´,
Já Que a Unit Do Projeto Não Tem Formulário. Então Não Sei o Nome Que Devo Usar :?:
Não Seria o Nome Da Unit :?: Ou Nome Do Projeto. :?:
Se For Sem Ou Com Extensão :?:
Obrigado...


GOSTEI 0
Marco Salles

Marco Salles

25/12/2003

Bom Dia Para Todos.Há Ums Dias Atrás Levantei Est aSituação No Forum.
O Josinaldo Gentilmente Sugeriu Que EScrevesse O Código Abaixo.
Enviada: Qui Dez 25, 2003 9:13 pm Assunto:

--------------------------------------------------------------------------------

//abra a unit do projeto -> project -> view source

{$R *.res}
//delclare esta variavel neste ponto
VAR Handle: THandle;
//o codigo abaixo verifica se o programa está aberto
begin
Handle := FindWindow(´Nome_formulario´, nil);
if Handle <> 0 Then //já está aberto
begin
application.MessageBox(´O programa já está aberto neste terminal, verifique!!!´, ´ATENÇÃO´,
mb_ok + mb_iconError);
Exit;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;

Acontece Dois Fatos :
O Primeiro é Que Continua Sem Compilar. Para Resolver Este Problema
Declarei Na Secção Uses Da Unit Do Projeto a Unit Windows.
uses
Windows; //Declarei Istop Manualmente.
Forms,
Unit1 in ´Unit1.pas´ ;
O Problema Da Compilação Parece Que Foi Resolvido. Mas As Instruções Apresentadas Insistem Em Não Fazer Efeito. Isto é Continuam Permitindo a Execução De Mais De Um Aplicativo. Testei Passo A Passo o Comando De Instruções e o Valor Da Variável Handle Em Qualquer Situação É Sempre ´ZERO´.
Então Amigos Continuam Pedindo Ajuda Sobre Este Tópico. Obrigao....
Colegas Sobre Este Tópico.


GOSTEI 0
Cebikyn

Cebikyn

25/12/2003

Três opções com técnicas diferentes:

[color=blue:7a332ce4ce][b:7a332ce4ce]1- Usando CreateMutex:[/b:7a332ce4ce][/color:7a332ce4ce]

No [b:7a332ce4ce]fim[/b:7a332ce4ce] de qualquer unit (antes do [b:7a332ce4ce]end.[/b:7a332ce4ce] ) coloque isto (exatamente como está):

var
  mHandle: THandle;    // Mutexhandle

initialization
  mHandle := CreateMutex(nil, True, ´XYZ´);
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    ShowMessage(´Este programa já está sendo executado!´);
    halt;
  end;

finalization
  if mHandle <> 0 then CloseHandle(mHandle)


[color=blue:7a332ce4ce][b:7a332ce4ce]2- Usando CreateSemaphore:[/b:7a332ce4ce][/color:7a332ce4ce]

No OnCreate de algum form:

procedure TForm1.FormCreate(Sender: TObject);
var
  Sem: THandle;
begin
  Sem := CreateSemaphore(nil, 0, 1, ´PROGRAM_NAME´);
  if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
  begin
    CloseHandle(Sem);
    ShowMessage(´Este programa já está sendo executado.´);
    Halt;
  end;
end;


[color=blue:7a332ce4ce][b:7a332ce4ce]3- Usando GlobalAddAtom:[/b:7a332ce4ce][/color:7a332ce4ce]

Este é para ser usado se o programa só puder ser inicializado uma vez por seção do Windows. No OnCreate de qualquer form:

procedure TForm1.FormCreate(Sender: TObject);
var
  atom: Integer;
begin
  if GlobalFindAtom(´A Text used to be stored in memory´) = 0 then
    atom := GlobalAddAtom(´A Text used to be stored in memory´)
  else
  begin
    ShowMessage(´Este programa só pode ser iniciado uma única vez.´);
    Close;
  end;
end;



GOSTEI 0
Rafaelgm

Rafaelgm

25/12/2003

[quote:184a954242=´Marco Salles´]Amigos , Tirei Esta Dica Do Clube. Mas Não Esta Compilando. Alguem Sabe Porque Ou Conhece Outra Maneira De Realizar.
Dica Que Tirei Do Clube :
´Se Voce Quer Executar Uma Única Cópia Do Seu Aplicativo, O Código De
Inicialização Do Arquivo Fonte do PROJETO Pode Ser Inscrito Conforme Segue:´
Begin
if [b:184a954242]HprevHist[/b:184a954242] = 0 Then
begin
Aplication.CreateForm(TForm1,Form1);
Aplication.Run;
end
else
MessageDlg(´Você Não Pode Executar Outra Cópia DoAplicativo´,
mtInformation,[mbok],0);
end;

Não Compila Porque Diz Que [b:184a954242]HPREVVIST[/b:184a954242] Não Esta Declarado. Aí Fiquei
a Ver Navios.
Amigos. O Que Pode Estar De Errado :?:[/quote:184a954242]
O nome da variável é ´HPrevInst´, e não ´HprevHist´ e nem ´HPREVVIST´.


GOSTEI 0
Beppe

Beppe

25/12/2003

De qualquer forma *não* se usa HPrevInst no Win32. Esta variável está aí para compatibilidade com 16 bits. Usem qualquer das alternativas que o cebikyn mostrou.


GOSTEI 0
POSTAR