Fórum Executar duas cópias do aplicativo #256275

27/10/2004

0

Pessoal, com esse código a baixo eu executo só uma cópia do aplicativo
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); 


Como faço para deixar o programa ser executado duas vezes?

Muito obrigado

Pedro Leonardo


Pleonardomv

Pleonardomv

Responder

Posts

27/10/2004

Delphi32

Talvez eu não tenha entendido sua pergunta direito, mas você já tentou remover o código? :wink:


Responder

Gostei + 0

27/10/2004

Pleonardomv

Se remover o código o programa poderá ser executado quantas vezes o usuário quizer e eu quero limitar p/ apenas duas execuções por máquina entendeu?
[]s


Responder

Gostei + 0

28/10/2004

Beto_martini

vc. já tentou alterar a condicional

if HprevHist = 0 para

if HprevHist <= 1?


Responder

Gostei + 0

28/10/2004

Pleonardomv

O problema é que tenho que saber se já tem uma aplicacao rodando e assim não funciona, já tentei inclusive assim
if HprevHist = 0 faça algo else
if HprevHist = 1 faça outra coisa

não funciona, acho que essa condicional só recebe Zero ou null

[]s


Responder

Gostei + 0

30/10/2004

Joao_schroeder

Olá
Não sei se é isso que tu queres. Eu não usei ainda, mas é uma dica que peguei da Internet para saber se a aplicação já foi inicializada.

Espero que sirva.

Um abraço


000130 - Descobrindo se o aplicativo já foi aberto      
 
Autor:  << indefinido >> 
Fonte:  << indefinida >> 

Insira o código abaixo dentro do arquivo .DPR de sua aplicação:
{$R *.RES}

begin
Application.Title :=´´;
Application.HelpFile :=´´;
if HPrevInst =0 then
  begin
    F_Splash :=TF_Splash.create(Application);
    F_Splash.Show;
    Application.CreateForm(TF_Menu, F_Menu);
    Application.CreateForm(TF_Error, F_Error);
    Application.CreateForm(TF_Form1, F_Form1);
    Application.CreateForm(TF_Form2, F_Form2);
    Application.Run;
  end
else
  MessageDlg (´O sistema já foi inicializado!, mtInformation, [mbOK], 0);
end. 




Responder

Gostei + 0

30/10/2004

Gilvanj

A chamada FindWindow com o primeiro parâmetro sendo zero é utilizada para procurar um programa que esteja rodando e que tenha na barra de título aquele nome. Assim, se vc executar FindWindow(0, ´Calculadora´), o Windows vai retonar o handle deste programa, que é um número aleatório. Se vc abrir duas cópias do programa Calc.exe (calculadora), FindWindow retornará o handle de uma delas. Isto é, não é suficiente para saber se o programa está rodando duas vezes.
Uma solução é utilizar EnumWindows para varrer a lista de programas abertos e verificar quantas referências a ´TheProgrammer´ existem ativas. Se já existir 2, então você pode abortar o programa.


Responder

Gostei + 0

30/10/2004

Tatuweb

[quote:1008e573ce=´Pedro Leonardo M. Vieira´]Como faço para deixar o programa ser executado duas vezes?[/quote:1008e573ce]
Fiz uma rotina que deve resolver o problema. Optei por usar a tabela global de átomos do SO. É possível fazer pesquisando os handles mais acho que do uso da tabela de átomos fica mais fácil. No form principal declara duas variáveis globais (veja abaixo):

var
  Form1: TForm1;
  AT01, AT02: Atom;      // <- variáveis declaradas

implementation
{$R *.DFM}


No DPR coloque como está exibido abaixo:

program Project1;

uses
  Forms, Windows, Dialogs,          // <- Não se esqueça da units...
  Unit1 in ´Unit1.pas´ ;

{$R *.RES}

const
  MP1 = ´MeuPrograma-Copia-#1´;
  MP2 = ´MeuPrograma-Copia-2´;

label
  Executa;

begin
  AT01 := GlobalFindAtom (MP1);
  if AT01 <> 0 then
  begin
    AT02 := GlobalFindAtom (MP2);
    if AT02 <> 0 then
    begin
      ShowMessage (´Você não pode executar mais de duas cópias!´);
      Halt;
    end else
    begin
      AT02 := GlobalAddAtom (MP2);
      goto Executa;
    end;
  end else
    AT01 := GlobalAddAtom (MP1);

Executa:
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


E no evento do OnDestroy do form principal coloque:

procedure TForm1.FormDestroy (Sender: TObject);
begin
  if AT01 <> 0 then
    if AT02 <> 0 then
      GlobalDeleteAtom (AT02)
    else
      GlobalDeleteAtom (AT01);
end;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar