Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
Delphi XE5 Professional
|
Re: Vierten Zeitstempel ermitteln
30. Mai 2008, 17:44
Zitat von nicodex:
Öhm, ja, schön, aber dein Buffer ist nicht so groß.
Stimmt.
Delphi-Quellcode:
function GetNTTime(fn: String; var FileInformation: FILE_BASIC_INFORMATION): Boolean;
var
dosfn : ANSI_STRING;
szNtDeviceName : array[0..MAX_PATH] of Char;
ObjName : UNICODE_STRING;
ObjectAttributes : OBJECT_ATTRIBUTES;
Buffer : array of WideChar;
Status : NTSTATUS;
DosErr : DWORD;
Error : PChar;
begin
Result := False;
FillChar(dosfn, SizeOf(ANSI_STRING), 0);
FillChar(ObjName, SizeOf(UNICODE_STRING), 0);
FillChar(ObjectAttributes, SizeOf(OBJECT_ATTRIBUTES), 0);
FillChar(FileInformation, SizeOf(FILE_BASIC_INFORMATION), 0);
QueryDosDevice(PAnsiChar(ExtractFileDrive(fn)), szNtDeviceName, MAX_PATH);
RtlInitAnsiString(@dosfn, PAnsiChar(Format('%s\%s', [szNtDeviceName, copy(fn, 4, Length(fn) - 3)])));
RtlAnsiStringToUnicodeString(@ObjName, @dosfn, True);
InitializeObjectAttributes(@ObjectAttributes, @ObjName, OBJ_CASE_INSENSITIVE, 0, nil);
Status := NtQueryAttributesFile(@ObjectAttributes, @FileInformation);
Result := NT_SUCCESS(Status);
if not Result
then begin
doserr := RtlNtStatusToDosError(Status);
SetLastError(DosErr);
GetMem(Error, 255);
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM, nil, GetLastError, 0, @Error, 255, nil);
ShowMessage(Trim(Error));
end;
end;
Damit sehen die Buffergrößen schon besser aus. Der Fehler ist damit leider nicht behoben.
Zitat von nicodex:
Deine Definition von TFileBasicInformation ist falsch (es fehlt die implizite Ausrichtung, die Struktur ist nicht packed!
Die Deklarationen habe ich von dort:
http://www.koders.com/delphi/fid50A5...6A08E3B70.aspx
http://www.koders.com/delphi/fidFFCC...D78A4039C.aspx
Dein Code funktioniert, aber meinem ist die Deklaration egal.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
|