Jhonatas araujo Postado Fevereiro 23, 2008 Denunciar Share Postado Fevereiro 23, 2008 Galera eu estou Desenvolvendo uma Application que faz uma Determinada Ação {y} com um Determinado tempo {x} ...Tipow eu pego a Data e hora que o Software foi Criado na Máquina/E para exemplo vamos usar: Depois de 30 dias e em 12:00 fazer uma Determinada Ação//Eu sei fazer!!! a função que se for tal Dia e Tal hora fazer tal Ação!!!Mais eu queria que Começasse a Contagem a partir do momento que foi Criado o Aplicativo na Máquina!!!E nesse Exemplo depois do Tempo, o Arquivo se Auto Deletária!!! {Só no Exemplo} ...Como Criar Isso/ ?/ alguém Sabe // Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Fevereiro 23, 2008 Denunciar Share Postado Fevereiro 23, 2008 Tipow eu pego a Data e hora que o Software foi Criado na Máquina/E para exemplo vamos usar: Depois de 30 dias e em 12:00 fazer uma Determinada Ação//Eu sei fazer!!! a função que se for tal Dia e Tal hora fazer tal Ação!!!Mais eu queria que Começasse a Contagem a partir do momento que foi Criado o Aplicativo na Máquina!!!E nesse Exemplo depois do Tempo, o Arquivo se Auto Deletária!!! {Só no Exemplo} ...OBS: Incentivo aos programadores a utilizar este tipo codigo, pois tive um problema com um cliente onde o programa já estava rodando a algum tempo ( mais de 30 dias ) e o cliente não se prontificou a fazer o pagamento e acabou não fazendo. No entanto como tinha no programa este codigo, no tempo determinado o mesmo se auto-deletou, e não precisei criar caso. Quando o programa sumiu o cliente voltou a me procurar, mas dai já não quis mais negociar com ele. ( Se o pagamento tivesse ocorrido, ai eu enviaria outro sem esta restrição ) function DataDeCriacao(Arq: string): TDate; var ffd: TWin32FindData; dft: DWORD; lft: TFileTime; h: THandle; begin h := Windows.FindFirstFile(PChar(Arq), ffd); try if (INVALID_HANDLE_VALUE <> h) then begin FileTimeToLocalFileTime(ffd.ftCreationTime, lft); FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo); Result := FileDateToDateTime(dft); end; finally Windows.FindClose(h); end; end; procedure TForm1.FormActivate(Sender: TObject); var Data: TDate; var Lista : TStringList; begin Data := DataDeCriacao(Application.ExeName); //Este programa se auto-deleta e o delexec.bat em 30 dias apos a data da sua criação if datetostr(data+30) <= datetostr(now) then begin Lista := TStringList.Create; try Lista.Add('del "'+ParamStr(0)+'"'); Lista.Add('del delexec.bat'); Lista.SaveToFile('delexec.bat'); finally Lista.Free; end; WinExec('delexec.bat',SW_HIDE); close; end; end;abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 jxfdasilva Postado Fevereiro 23, 2008 Denunciar Share Postado Fevereiro 23, 2008 Gostei Jhonas!Abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonatas araujo Postado Fevereiro 23, 2008 Autor Denunciar Share Postado Fevereiro 23, 2008 (editado) Pode cre... bem Da hora!!! Parabens/ mano//Ow Jhonas Mais eu já tinha testado essa parte:begin Lista := TStringList.Create; try Lista.Add('del "'+ParamStr(0)+'"'); Lista.Add('del delexec.bat'); Lista.SaveToFile('delexec.bat'); finally Lista.Free; end; WinExec('delexec.bat',SW_HIDE); close; end; end;Muitas vezes e Nunca ele se Auto Deleta!!!Razão:Por que o mesmo {o 'delexec.bat'} foi Chamado pelo Aplicativo e o Aplicativo está na memória do Sistema ainda...//Fazendo dar erro e não Deleta-lo!!!Mais Ai deu Certo?/?Se deu/ oque eu estou fazendo de Errado??/Vlw...Abraço... Editado Fevereiro 23, 2008 por Jhonatas araujo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Fevereiro 24, 2008 Denunciar Share Postado Fevereiro 24, 2008 Mais Ai deu Certo?/?Se deu/ oque eu estou fazendo de Errado??/Aqui comigo sempre da certo ... se voce executar pelo delphi ele some com o executavel e se tentar rodar de novo vai receber a mensagem:Could not find program, 'C:\Arquivos de Programas\Borland\Delphi5\Bin\Project1.exe'ou seja, ele não encontra mais o programa ... para fazer funcionar novamente voce tem que compilar novamente o programafaça o teste do codigo, colocando ele num botao e veja o que acontece. function DataDeCriacao(Arq: string): TDate; var ffd: TWin32FindData; dft: DWORD; lft: TFileTime; h: THandle; begin h := Windows.FindFirstFile(PChar(Arq), ffd); try if (INVALID_HANDLE_VALUE <> h) then begin FileTimeToLocalFileTime(ffd.ftCreationTime, lft); FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo); Result := FileDateToDateTime(dft); end; finally Windows.FindClose(h); end; end; procedure TForm1.Button1Click(Sender: TObject); var Data: TDate; var Lista : TStringList; begin Data := DataDeCriacao(Application.ExeName); //Este programa se auto-deleta e o proprio delexec.bat em 30 dias apos a data da sua criação if datetostr(data) = datetostr(now) then begin Lista := TStringList.Create; try Lista.Add('del "'+ParamStr(0)+'"'); Lista.Add('del delexec.bat'); Lista.SaveToFile('delexec.bat'); finally Lista.Free; end; WinExec('delexec.bat',SW_HIDE); close; end; end;abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonatas araujo Postado Fevereiro 24, 2008 Autor Denunciar Share Postado Fevereiro 24, 2008 (editado) Olha só o Código: e Dá Erro//unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Registry; type TForm1 = class(TForm) procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormActivate(Sender: TObject); var Lista : TStringList; begin Lista := TStringList.Create; try Lista.Add('Del "'+ParamStr(0)+'"'); Lista.Add('Del Delexec.bat'); Lista.SaveToFile('Delexec.bat'); finally Lista.Free; end; WinExec('delexec.bat',SW_HIDE); close; end; end. E também : unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Registry; type TForm1 = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin WinExec('Delexec.bat', SW_HIDE); end; procedure TForm1.FormCreate(Sender: TObject); var Lista : TStringList; begin Lista := TStringList.Create; try Lista.Add('Del "'+ParamStr(0)+'"'); Lista.Add('Del Delexec.bat'); Lista.SaveToFile('Delexec.bat'); finally Lista.Free; end; end; end.Ele só Deleta o Proprio "Delexec.bat" Mais o Executavel... Continua ...Saberia Me Responder qual é meu Erro!!! Estou Usando o Delphi 7 e o 2007 !!!VlwAbraço . Editado Fevereiro 24, 2008 por Jhonatas araujo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Fevereiro 24, 2008 Denunciar Share Postado Fevereiro 24, 2008 Caro Jhonatas ...voce deve prestar um pouquinho mais de atenção, se voce olhar no post que te passei, voce copiou apenas uma parte do codigo ( onde esta a condição da data ?) , e a outra ( function ) ????unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} function DataDeCriacao(Arq: string): TDate; var ffd: TWin32FindData; dft: DWORD; lft: TFileTime; h: THandle; begin h := Windows.FindFirstFile(PChar(Arq), ffd); try if (INVALID_HANDLE_VALUE <> h) then begin FileTimeToLocalFileTime(ffd.ftCreationTime, lft); FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo); Result := FileDateToDateTime(dft); end; finally Windows.FindClose(h); end; end; procedure TForm1.Button1Click(Sender: TObject); var Data: TDate; var Lista : TStringList; begin Data := DataDeCriacao(Application.ExeName); //Este programa se auto-deleta e o proprio delexec.bat em 30 dias apos a data da sua criação if datetostr(data) <= datetostr(now) then begin Lista := TStringList.Create; try Lista.Add('del "'+ParamStr(0)+'"'); Lista.Add('del delexec.bat'); Lista.SaveToFile('delexec.bat'); finally Lista.Free; end; WinExec('delexec.bat',SW_HIDE); close; end; end; end.OBS: Se voce copiar errado não vai funcionar neste comando : if datetostr(data) = datetostr(now) then basta acrescentar o numero de dias que voce quer que seu programa funcione exemplo : if datetostr(data+ 60) = datetostr(now) then // se auto-deleta apos 60 dias abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonatas araujo Postado Fevereiro 24, 2008 Autor Denunciar Share Postado Fevereiro 24, 2008 (editado) Eu seiii!!! Eu não Seria tão Burro Assim!!!Foi Apenas o Exemplo que te Mostrei!!!Por que a Parte da Data Ela Funciona!!! {a que você Menssionou}; //eu Testei em Outros Feitos e Ele Funciona//Mais oque não Funciona é apenas a Função de Deletar!!! // Aqui não está Funcionando //E Eu não Apenas Copio o Código, eu Estudo muito antes, e Monto Minha Aplicação!!!Desculpa, mais você me entendeu Errado!!!A Parte da Data Funciona Perfeitamente!!! Mais é só a parte De Deletar!!!Por Isso que Menssionei o Post #4 !!! e no poster #1E nesse Exemplo depois do Tempo, o Arquivo se Auto Deletária!!! {Só no Exemplo} ...Desculpa mesmo ai Qualquer Coisa!!!è que já Testei de Todo jeito e Não Funciona!!!vlw Abraço ... Editado Fevereiro 24, 2008 por Jhonatas araujo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Fevereiro 24, 2008 Denunciar Share Postado Fevereiro 24, 2008 Desculpa, mais você me entendeu Errado!!!A Parte da Data Funciona Perfeitamente!!! Mais é só a parte De Deletar!!!ok ... não precisa pedir desculpas ... mas comigo funcionafaça este teste, coloque o codigo no OnActive do form, do jeito que esta aqui. não vai ter erro.procedure TForm1.FormActivate(Sender: TObject); var Data: TDate; var Lista : TStringList; begin Data := DataDeCriacao(Application.ExeName); if datetostr(data) <= datetostr(now) then begin Lista := TStringList.Create; try Lista.Add('del "'+ParamStr(0)+'"'); Lista.Add('del delexec.bat'); Lista.SaveToFile('delexec.bat'); finally Lista.Free; end; WinExec('delexec.bat',SW_HIDE); close; end; end;abraço; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonatas araujo Postado Fevereiro 24, 2008 Autor Denunciar Share Postado Fevereiro 24, 2008 (editado) unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function DataDeCriacao(Arq: string): TDate; var ffd: TWin32FindData; dft: DWORD; lft: TFileTime; h: THandle; begin h := Windows.FindFirstFile(PChar(Arq), ffd); try if (INVALID_HANDLE_VALUE <> h) then begin FileTimeToLocalFileTime(ffd.ftCreationTime, lft); FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo); Result := FileDateToDateTime(dft); end; finally Windows.FindClose(h); end; end; procedure TForm1.FormActivate(Sender: TObject); var Data: TDate; var Lista : TStringList; begin Data := DataDeCriacao(Application.ExeName); if datetostr(data) <= datetostr(now) then begin Lista := TStringList.Create; try Lista.Add('del "'+ParamStr(0)+'"'); Lista.Add('del delexec.bat'); Lista.SaveToFile('delexec.bat'); finally Lista.Free; end; WinExec('delexec.bat',SW_HIDE); close; end; end; end.Cara eu Fiz Fiz e Refiz!!!E Não Funciona!!!Deve ser Algum problema aqui!!! -_- Mais eu já Testei no Delphi 7 e o 2007Oque será que pode ser//vlw Abraço ... Editado Fevereiro 24, 2008 por Jhonatas araujo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Fevereiro 24, 2008 Denunciar Share Postado Fevereiro 24, 2008 Mais eu queria que Começasse a Contagem a partir do momento que foi Criado o Aplicativo na Máquina!!!E nesse Exemplo depois do Tempo, o Arquivo se Auto Deletária!!! {Só no Exemplo} ...Isto não funciona tão bem quanto parece. Se eu tiver a instalação de um programa e após um tempo ele se auto-deletar, eu simplesmente o instalaria novamente e alteraria sua data antes de usá-lo (tem vários programinhas na net para esta finalidade)Eu não faço uso deste tipo de recurso, mas talvez o componente TmxProtector que mencionei neste post possa vir a servir como meio de proteção do software - dê uma olhada nos recursos que ele oferece.Mais eu já tinha testado essa parte:...Muitas vezes e Nunca ele se Auto Deleta!!!Razão:Por que o mesmo {o 'delexec.bat'} foi Chamado pelo Aplicativo e o Aplicativo está na memória do Sistema ainda...//Fazendo dar erro e não Deleta-lo!!!No Windows (o que não ocorre no Linux), quando o programa está em uso, não é possível excluí-lo! (ao menos, foi o que apurei há algum tempo, justamente tentando retirar esta dúvida)neste comando : if datetostr(data) = datetostr(now) then basta acrescentar o numero de dias que voce quer que seu programa funcione exemplo : if datetostr(data+ 60) = datetostr(now) then // se auto-deleta apos 60 diaspara funcionar corretamente, este teste deveria manter a verificação fazendo uso do "<=" (como postado inicialmente) e, ainda, não poderia avaliar a data no formato string. Observe o que ocorreria se tivéssemos as datas:Criação do arquivo: 23/2/2008Data Atual: 13/3/2008no teste do primeiro caracter das datas convertidas para string, "1" é menor que "2", logo já se passaram 19 dias e a data atual seria erroneamente considerada menor que a de criação.Devemos ter em mente que, em ordenação de datas no formato string, devemos formatá-la como yyyy/mm/dd para uma correta comparação.Também acrescentaria que seria mais interessante utilizar apenas a data, deixando de fora a parte correspondente à horas.Então, temos duas opções:if FormatDateTime('yyyy/mm/dd', data+ 60) <= FormatDateTime('yyyy/mm/dd', Date) thenou if Trunc(data+ 60) <= Trunc(Date) then... mas comigo funcionafaça este teste, coloque o codigo no OnActive do form, do jeito que esta aqui. não vai ter erro.Jhonas, eu lhe diria que é uma questão de tempo (ou melhor processamento). Aparentemente, o programa a ser executado via WinExec demora um pouquinho para ser "startado", dando a chance de o nosso programa encerrar e então ser excluído.Exagerando um pouquinho, faça você o seguinte teste: coloque um Sleep(1000) logo após o WinExec e antes do Close.Talvez uma alternativa seja executar este procedimento o mais próximo possível do encerramento do programa (ou antes mesmo de criar qualquer tela).Jhonatas araujo, experimente mover o código do Jhonas para o fonte (source) do projeto. Possivelmente você deverá acrescentar a cláusula uses as units: Windows, SysUtils e Classes.Ficaria algo assim:program Project1; uses Forms, Windows, SysUtils, Classes, unit1 in 'unit1.pas' {Form1}; {$R *.RES} var Data: TDateTime; Lista : TStringList; function DataDeCriacao(Arq: string): TDateTime; var ffd: TWin32FindData; dft: DWORD; lft: TFileTime; h: THandle; begin ... end; begin Data := DataDeCriacao(Application.ExeName); if Trunc(data+60) <= Trunc(Date) then begin Lista := TStringList.Create; try Lista.Add('del "'+ParamStr(0)+'"'); Lista.Add('del delexec.bat'); Lista.SaveToFile('delexec.bat'); finally Lista.Free; end; WinExec('delexec.bat',SW_HIDE); // Sleep(10); // usado o para teste end else begin // continua com programa normalmente Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; end.Na máquina em que testei, 10 milisegundos foi o tempo máximo que pude colocar para que a aplicação pudesse ser excluída. Logo, acredito que possa funcionar para você - experimente.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonatas araujo Postado Fevereiro 25, 2008 Autor Denunciar Share Postado Fevereiro 25, 2008 (editado) Vlw...Jhonas, Micheus...Aqui ele Não Deleta de Jeito Nenhum!!! Mais Deixa Ta Valendo!!!Deve ser Algum Erro Aqui/ Sei la!!! Tentarei até Encontrar oque é!!!Vlw mesmo// Pela Paciencia e Atenção!!!{Resolvido}// Editado Fevereiro 25, 2008 por Jhonatas araujo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Fevereiro 25, 2008 Denunciar Share Postado Fevereiro 25, 2008 Aqui ele Não Deleta de Jeito Nenhum!!! Mais Deixa Ta Valendo!!!Deve ser Algum Erro Aqui/ Sei la!!! Tentarei até Encontrar oque é!!!Apesar do que eu sugeri como possibilidade de utilização do que o colega Jhonas lhe apresentou, na verdade não deveria deletar mesmo (como mencionei, no Windows não vai funcionar) - você precisará de algum outro artifício para isto.Talvez, adicionar a um arquivo de recursos um pequeno programa que delete o seu programa:- Voce testa a data, como já faz; - se venceu, extrai o pequeno programa para uma pasta temporária; - o coloca em execução e encerra o seu programa;este programa temporário, verifica que seu programa não está mais rodando e o exclui; Ele poderá ficar lá mesmo na pasta temporária, já que não terá qualquer utilidade.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Fevereiro 25, 2008 Denunciar Share Postado Fevereiro 25, 2008 Aqui ele Não Deleta de Jeito Nenhum!!! Mais Deixa Ta Valendo!!!Jhonatas.. fiz uma modificação no codigo ... tenta aiunit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} function DataDeCriacao(Arq: string): TDate; var ffd: TWin32FindData; dft: DWORD; lft: TFileTime; h: THandle; begin h := Windows.FindFirstFile(PChar(Arq), ffd); try if (INVALID_HANDLE_VALUE <> h) then begin FileTimeToLocalFileTime(ffd.ftCreationTime, lft); FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo); Result := FileDateToDateTime(dft); end; finally Windows.FindClose(h); end; end; procedure TForm1.FormActivate(Sender: TObject); var F: TextFile; Bat: string; Data : TDate; begin Data := DataDeCriacao(Application.ExeName); //Este programa se auto-deleta e o proprio delexec.bat em 30 dias apos a data da sua criação if datetostr(data+30) <= datetostr(now) then begin Bat := ChangeFileExt(Application.ExeName,'.bat'); AssignFile(F, Bat); Rewrite(F); WriteLn(F, Format('DEL "%s"', [Application.ExeName])); WriteLn(F, Format('DEL "%s"', [Bat])); CloseFile(F); WinExec(PChar(Bat), SW_HIDE); Application.Terminate; end; end; end.abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonatas araujo Postado Fevereiro 26, 2008 Autor Denunciar Share Postado Fevereiro 26, 2008 (editado) Ae Jhonas, Micheus Vlwwww Cara!!!¬¬O Jhonas Mesmo Assim Não Funcionou!!! ;) Mais com Seus Exemplos Ajudou MuitoO Muito Mesmo...Eu já Tive Altas Ideias para Outras Coisas... Vlw mesmo //EMicheus:Cara eu nunca Penssei Nisso!!!é mesmo Muito Boa Idéia Dessa Forma Nunca irá Falhar!!!Sem Palavras Obrigado Pela Paciência e a Atenção... <>Vlw...Abraço// {Resolvido} Editado Fevereiro 26, 2008 por Jhonatas araujo Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Jhonatas araujo
Galera eu estou Desenvolvendo uma Application que faz uma Determinada Ação {y} com um Determinado tempo {x} ...
Tipow eu pego a Data e hora que o Software foi Criado na Máquina/
E para exemplo vamos usar:
Depois de 30 dias e em 12:00 fazer uma Determinada Ação//
Eu sei fazer!!! a função que se for tal Dia e Tal hora fazer tal Ação!!!
Mais eu queria que Começasse a Contagem a partir do momento que foi Criado o Aplicativo na Máquina!!!
E nesse Exemplo depois do Tempo, o Arquivo se Auto Deletária!!! {Só no Exemplo} ...
Como Criar Isso/ ?/ alguém Sabe //
Link para o comentário
Compartilhar em outros sites
14 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.