Executar duas cópias do aplicativo
Pessoal, com esse código a baixo eu executo só uma cópia do aplicativo
Como faço para deixar o programa ser executado duas vezes?
Muito obrigado
Pedro Leonardo
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
Curtidas 0
Respostas
Delphi32
27/10/2004
Talvez eu não tenha entendido sua pergunta direito, mas você já tentou remover o código? :wink:
GOSTEI 0
Pleonardomv
27/10/2004
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
[]s
GOSTEI 0
Beto_martini
27/10/2004
vc. já tentou alterar a condicional
if HprevHist = 0 para
if HprevHist <= 1?
if HprevHist = 0 para
if HprevHist <= 1?
GOSTEI 0
Pleonardomv
27/10/2004
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
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
GOSTEI 0
Joao_schroeder
27/10/2004
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
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.
GOSTEI 0
Gilvanj
27/10/2004
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.
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.
GOSTEI 0
Tatuweb
27/10/2004
[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):
No DPR coloque como está exibido abaixo:
E no evento do OnDestroy do form principal coloque:
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;
GOSTEI 0