Fórum Data de atributos do Executável #418815

21/06/2012

0

Bom dia a todos.

Tenho a seguinte dúvida.
Tenho uma rotina que pega Nome do Executável, Data de Criação, Data de Modificação e Data de Último Acesso.

Porém ao compilar e gerar o executável, ao comparar as datas de Criação, Modificação e Último Acesso, o Executável do Delphi sempre mostra a data correta, porém a hora sempre com 3 horas a mais.

Exemplo:
1) Data de Criação
- Executável do Delphi: 21/06/2012 12:10:24
- Propriedades do Executável: ‎Hoje, ‎21‎ de ‎junho‎ de ‎2012, ‏‎1 hora atrás (No caso, 09:10(botão direito em cima do executável e clico em propriedades)

Para todos os atributos do tipo data hora, no executável do delphi, sempre 3 horas a mais.

Como resolver isto?
Fábio Sela

Fábio Sela

Responder

Post mais votado

21/06/2012

So uma pergunta antes de proseguir

A unidade IOUtils tem muitas funçoes ja prontas que retornam isto ..

de uma olhadano record TFILE

Por exemplo a data da criação de um Arquivo

Showmessage(DateTimetostr(TFile.GetCreationTime(CaminhoDoSeuArquivo)));

exitem muitas funçoes que me parecem serem iguais a que vc esta escrevendo , porém de modo Nativo do Delph
Sem ter que recorrer a funçoes de terceiros

Marco Salles

Marco Salles
Responder

Gostei + 1

Mais Posts

21/06/2012

Marco Salles

Poderia fornecer a rotina que utiliza para mostrar a Data com a Hora ???
Responder

Gostei + 0

21/06/2012

Fábio Sela

Rotida que pega as datas:

procedure TfrmAtritubos.BitBtn5Click(Sender: TObject);
var
SearchFile: TSearchRec;
lpSystemTime: TSystemTime;
Caminho, NomeExec : String;
HoraLocal : TDateTime;
begin
if (edtCaminhoExe.Text = ) then
Begin
ShowMessage(O campo Caminho do Exec. não pode estar em branco);
End;
//edtNomeExec.text := edtCaminhoExe.Text; // Esta rotina mostra o nome do executável com o caminho completo
edtNomeExec.text := ExtractFileName(edtCaminhoExe.Text); // Esta rotina mostra apenas o nome do executável.
NomeExec := edtNomeExec.Text;
{ arquivo }
FindFirst(NomeExec,faAnyFile,SearchFile);
try
{ Criação }
FileTimeToSystemTime
(SearchFile.FindData.ftCreationTime,lpSystemTime);
edtDataCriacao.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
{ Modificado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastWriteTime,lpSystemTime);
edtDataModificacao.text := DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
{ Acessado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastAccessTime,lpSystemTime);
edtUltimoAcesso.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
finally
FindClose(SearchFile);
end;
end;

Segue rotina completa:

unit untAtributos;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Menus;

type
TfrmAtritubos = class(TForm)
edtCaminhoExe: TEdit;
Label1: TLabel;
edtNomeExec: TEdit;
Label2: TLabel;
Label4: TLabel;
Label5: TLabel;
edtUltimoAcesso: TEdit;
Label6: TLabel;
BitBtn1: TBitBtn;
edtDataCriacao: TEdit;
edtDataModificacao: TEdit;
MainMenu1: TMainMenu;
Arquivo1: TMenuItem;
Abrir1: TMenuItem;
Sais1: TMenuItem;
dlgAbrir: TOpenDialog;
BitBtn2: TBitBtn;
Verso1: TMenuItem;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
edtVersaoSystemGlass: TEdit;
Label7: TLabel;
DatadaUltimaModificaoDesteExecutvel1: TMenuItem;
ltimaModificao1: TMenuItem;
btnAtributos: TBitBtn;
Label3: TLabel;
procedure btnAtributosClick(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure Sais1Click(Sender: TObject);
procedure Abrir1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Verso1Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure ltimaModificao1Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
private
{ Private declarations }
Function VersaoExeArqExt(pCaminhoExec:String): String;
public
{ Public declarations }
end;

var
frmAtritubos: TfrmAtritubos;

implementation

{$R *.dfm}

Function VersaoExe: String;
type
PFFI = ^vs_FixedFileInfo;
var
F : PFFI;
Handle : Dword;
Len : Longint;
Data : Pchar;
Buffer : Pointer;
Tamanho : Dword;
Parquivo: Pchar;
Arquivo : String;
begin
Arquivo := Application.ExeName;
Parquivo := StrAlloc(Length(Arquivo) + 1);
StrPcopy(Parquivo, Arquivo);
Len := GetFileVersionInfoSize(Parquivo, Handle);
Result := ;
if Len > 0 then
begin
Data:=StrAlloc(Len+1);
if GetFileVersionInfo(Parquivo,Handle,Len,Data) then
begin
VerQueryValue(Data, ,Buffer,Tamanho);
F := PFFI(Buffer);
Result := Format(%d.%d.%d.%d,
[HiWord(F^.dwFileVersionMs),
LoWord(F^.dwFileVersionMs),
HiWord(F^.dwFileVersionLs),
Loword(F^.dwFileVersionLs)]
);
end;
StrDispose(Data);
end;
StrDispose(Parquivo);
end;

Function TfrmAtritubos.VersaoExeArqExt(pCaminhoExec:String): String;
type
PFFI = ^vs_FixedFileInfo;
var
F : PFFI;
Handle : Dword;
Len : Longint;
Data : Pchar;
Buffer : Pointer;
Tamanho : Dword;
Parquivo: Pchar;
Arquivo : String;
CaminhoExec : String;
begin
Arquivo := pCaminhoExec;//C:\Output\SystemGlass\SystemGlass.exe;
Parquivo := StrAlloc(Length(Arquivo) + 1);
StrPcopy(Parquivo, Arquivo);
Len := GetFileVersionInfoSize(Parquivo, Handle);
Result := ;
if Len > 0 then
begin
Data:=StrAlloc(Len+1);
if GetFileVersionInfo(Parquivo,Handle,Len,Data) then
begin
VerQueryValue(Data, \,Buffer,Tamanho);
F := PFFI(Buffer);
Result := Format(%d.%d.%d.%d,
[HiWord(F^.dwFileVersionMs),
LoWord(F^.dwFileVersionMs),
HiWord(F^.dwFileVersionLs),
Loword(F^.dwFileVersionLs)]
);
end;
StrDispose(Data);
end;
StrDispose(Parquivo);
end;

procedure TfrmAtritubos.btnAtributosClick(Sender: TObject);
var
SearchFile: TSearchRec;
lpSystemTime: TSystemTime;
Caminho, NomeExec : String;
HoraLocal : TDateTime;
begin
if (edtCaminhoExe.Text = ) then
Begin
ShowMessage(O campo Caminho do Exec. não pode estar em branco);
End;
edtNomeExec.text := edtCaminhoExe.Text;
NomeExec := edtNomeExec.Text;
{ arquivo }
FindFirst(NomeExec,faAnyFile,SearchFile);
try
{ Criação }
FileTimeToSystemTime
(SearchFile.FindData.ftCreationTime,lpSystemTime);
edtDataCriacao.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
{ Modificado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastWriteTime,lpSystemTime);
edtDataModificacao.text := DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
{ Acessado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastAccessTime,lpSystemTime);
edtUltimoAcesso.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
finally
FindClose(SearchFile);
end;
end;

procedure TfrmAtritubos.BitBtn1Click(Sender: TObject);
begin
Close;
end;

procedure TfrmAtritubos.Sais1Click(Sender: TObject);
begin
Close;
end;

procedure TfrmAtritubos.Abrir1Click(Sender: TObject);
Var
Arquivo : string;
begin
//--> dlgAbrir.Execute: somente ocorre se o usuário inserir um nome
//--> Para o arquivo e clicar no botão salvar do save dialog
if (dlgAbrir.Execute) then //--> Sempre usar if para dialogs
begin
//--> Carregamos o caminho do arquivo na variável arquivo
Arquivo := dlgAbrir.FileName;
//--> Salvamos o texto do memo para o arquivo especificado.
edtCaminhoExe.text := Arquivo;
end;
end;

procedure TfrmAtritubos.BitBtn2Click(Sender: TObject);
Var
Arquivo : string;
begin
//--> dlgAbrir.Execute: somente ocorre se o usuário inserir um nome
//--> Para o arquivo e clicar no botão salvar do save dialog
if (dlgAbrir.Execute) then //--> Sempre usar if para dialogs
begin
//--> Carregamos o caminho do arquivo na variável arquivo
Arquivo := dlgAbrir.FileName;
//--> Salvamos o texto do memo para o arquivo especificado.
edtCaminhoExe.text := Arquivo;
end;
end;

procedure TfrmAtritubos.Verso1Click(Sender: TObject);
begin
ShowMessage( A atual versão do sistema é: + VersaoExe);
end;

procedure TfrmAtritubos.BitBtn3Click(Sender: TObject);
begin
edtNomeExec.Clear;
edtDataCriacao.Clear;
edtDataModificacao.Clear;
edtUltimoAcesso.Clear;
end;

procedure TfrmAtritubos.BitBtn4Click(Sender: TObject);
Var
CaminhoExec : String;
begin
//ShowMessage(VersaoExeArqExt);
edtVersaoSystemGlass.Text := VersaoExeArqExt(edtCaminhoExe.Text);
end;

procedure TfrmAtritubos.ltimaModificao1Click(Sender: TObject);
// Retirado do Site:
// http://www.tecnobyte.com.br/dica4.html#dica75
var
DataExe: String;
Titulo: integer;
Caminho : String;
NomeExec : String;
Versao : String;
begin
NomeExec := edtNomeExec.Text;
Caminho := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + \ + NomeExec;
Titulo := FileOpen(NomeExec, 0);
//edtDataExecModificado.Text := DateTimeToStr(FileDateToDateTime(FileAge(ParamStr(0))));
// Mostra a data da ultima modificação deste executável.
//edtDataExecModificado.Text := DatetimeToStr(FileDateToDateTime(FileAge(Application.ExeName)));
ShowMessage(DatetimeToStr(FileDateToDateTime(FileAge(Application.ExeName))));
end;

procedure TfrmAtritubos.BitBtn5Click(Sender: TObject);
var
SearchFile: TSearchRec;
lpSystemTime: TSystemTime;
Caminho, NomeExec : String;
HoraLocal : TDateTime;
begin
if (edtCaminhoExe.Text = ) then
Begin
ShowMessage(O campo Caminho do Exec. não pode estar em branco);
End;
//edtNomeExec.text := edtCaminhoExe.Text; // Esta rotina mostra o nome do executável com o caminho completo
edtNomeExec.text := ExtractFileName(edtCaminhoExe.Text); // Esta rotina mostra apenas o nome do executável.
NomeExec := edtNomeExec.Text;
{ arquivo }
FindFirst(NomeExec,faAnyFile,SearchFile);
try
{ Criação }
FileTimeToSystemTime
(SearchFile.FindData.ftCreationTime,lpSystemTime);
edtDataCriacao.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
{ Modificado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastWriteTime,lpSystemTime);
edtDataModificacao.text := DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
{ Acessado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastAccessTime,lpSystemTime);
edtUltimoAcesso.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
finally
FindClose(SearchFile);
end;
end;

end.
Responder

Gostei + 0

21/06/2012

Marco Salles

Hummm , calma ai

A rotina que esta dando erro seria esta ?

procedure TfrmAtritubos.ltimaModificao1Click(Sender: TObject);
// Retirado do Site:
// http://www.tecnobyte.com.br/dica4.html#dica75
var
DataExe: String;
Titulo: integer;
Caminho : String;
NomeExec : String;
Versao : String;
begin
NomeExec := edtNomeExec.Text;
Caminho := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + \ + NomeExec;
Titulo := FileOpen(NomeExec, 0);
//edtDataExecModificado.Text := DateTimeToStr(FileDateToDateTime(FileAge(ParamStr(0))));
// Mostra a data da ultima modificação deste executável.
//edtDataExecModificado.Text := DatetimeToStr(FileDateToDateTime(FileAge(Application.ExeName)));
ShowMessage(DatetimeToStr(FileDateToDateTime(FileAge(Application.ExeName))));
end;
Responder

Gostei + 0

21/06/2012

Fábio Sela

a rotina que está com problemas é esta:

procedure TfrmAtritubos.BitBtn5Click(Sender: TObject);
var
SearchFile: TSearchRec;
lpSystemTime: TSystemTime;
Caminho, NomeExec : String;
HoraLocal : TDateTime;
begin
if (edtCaminhoExe.Text = ) then
Begin
ShowMessage(O campo Caminho do Exec. não pode estar em branco);
End;
//edtNomeExec.text := edtCaminhoExe.Text; // Esta rotina mostra o nome do executável com o caminho completo
edtNomeExec.text := ExtractFileName(edtCaminhoExe.Text); // Esta rotina mostra apenas o nome do executável.
NomeExec := edtNomeExec.Text;
{ arquivo }
FindFirst(NomeExec,faAnyFile,SearchFile);
try
{ Criação }
FileTimeToSystemTime
(SearchFile.FindData.ftCreationTime,lpSystemTime);
edtDataCriacao.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
{ Modificado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastWriteTime,lpSystemTime);
edtDataModificacao.text := DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
{ Acessado }
FileTimeToSystemTime
(SearchFile.FindData.ftLastAccessTime,lpSystemTime);
edtUltimoAcesso.text:=DateTimeToStr(SystemTimeToDateTime(lpSystemTime));
finally
FindClose(SearchFile);
end;
end;
Responder

Gostei + 0

21/06/2012

Deivison Melo

function GetVersionExe(pExeFile: string): string;
var
_Size: DWORD;
_VerInfo: Pointer;
_ValueSize: DWORD;
_Value: PVSFixedFileInfo;
_Dummy: DWORD;
_V1, _V2, _V3, _V4: Word;
begin
_Size := GetFileVersionInfoSize(PChar(pExeFile), _Dummy) ;
GetMem(_VerInfo, _Size);
GetFileVersionInfo(PChar(pExeFile), 0, _Size, _VerInfo);
VerQueryValue(_VerInfo, \, Pointer(_Value), _ValueSize);
with _Value^ do
begin
_V1 := dwFileVersionMS shr 16;
_V2 := dwFileVersionMS and $FFFF;
_V3 := dwFileVersionLS shr 16;
_V4 := dwFileVersionLS and $FFFF;
end;
FreeMem(_VerInfo, _Size);
Result := Copy(IntToStr(100 + _V1), 3, 2) + . +
Copy(IntToStr(100 + _V2), 3, 2) + . +
Copy(IntToStr(100 + _V3), 3, 2) + . +
Copy(IntToStr(100 + _V4), 3, 2);
end;
Responder

Gostei + 0

21/06/2012

Deivison Melo

OU ainda

http://codigodelphi.blogspot.com.br/2009/09/pega-informacoes-de-versao-de-qualquer.html
Responder

Gostei + 0

21/06/2012

Fábio Sela

Deivison, explique um pouco melhor esta função.

se possível com um exemplo, por gentileza.

Grato.
Responder

Gostei + 0

21/06/2012

Fábio Sela

Valeu Marco. Vou dar uma Olhada nisso.

Grato.
Responder

Gostei + 0

21/06/2012

Fábio Sela

Da um erro ao tentar compilar:

Coloco a expressão:
Showmessage(DateTimetostr(TFile.GetCreationTime(edtCaminhoExe.Text)));

e aparece mensagem:
[Error] untAtributos.pas(319): Undeclared identifier: TFile

Responder

Gostei + 0

21/06/2012

Fábio Sela

descobri, é porque to tentando compilar em delphi7.

coloquei o projeto no delphi 10 e compilou.

pode encerrar o topico.

grato.
Responder

Gostei + 0

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

Aceitar