FILE_INFO_BY_HANDLE_CLASS, _FILE_END_OF_FILE_INFO en SetFileInformationByHandle waren niet bekend in mijn Delphi (10.4) dus ik vermoed dat je deze zelf gedeclareerd hebt.
In C is een ENUM minimaal 4 bytes, daarom moet je altijd {$MINENUMSIZE 4} erbij zetten, mogelijk is dit je probleem of er zit een ander foutje in de vertaling?
Voor mij werkt de het volgende:
Code:
type
{$ALIGN ON}
{$MINENUMSIZE 4}
FILE_INFO_BY_HANDLE_CLASS = (
FileBasicInfo,
FileStandardInfo,
FileNameInfo,
FileRenameInfo,
FileDispositionInfo,
FileAllocationInfo,
FileEndOfFileInfo,
FileStreamInfo,
FileCompressionInfo,
FileAttributeTagInfo,
FileIdBothDirectoryInfo,
FileIdBothDirectoryRestartInfo,
FileIoPriorityHintInfo,
FileRemoteProtocolInfo,
FileFullDirectoryInfo,
FileFullDirectoryRestartInfo,
FileStorageInfo,
FileAlignmentInfo,
FileIdInfo,
FileIdExtdDirectoryInfo,
FileIdExtdDirectoryRestartInfo,
FileDispositionInfoEx,
FileRenameInfoEx,
FileCaseSensitiveInfo,
FileNormalizedNameInfo,
MaximumFileInfoByHandleClass
);
_FILE_END_OF_FILE_INFO = record
EndOfFile: LARGE_INTEGER;
end;
FILE_END_OF_FILE_INFO = _FILE_END_OF_FILE_INFO;
PFILE_END_OF_FILE_INFO = ^FILE_END_OF_FILE_INFO;
function SetFileInformationByHandle(hFile: THandle;
FileInformationClass: FILE_INFO_BY_HANDLE_CLASS; lpFileInformation: LPVOID;
dwBufferSize: DWORD): BOOL; stdcall; external 'kernel32.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
Dest : Thandle;
eof: FILE_END_OF_FILE_INFO;
DestName: String;
begin
DestName := 'c:\temp\test.txt';
Dest := CreateFile(PChar(DestName), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING, 0);
if Dest = INVALID_HANDLE_VALUE then RaiseLastOSError;
try
eof.EndOfFile.QuadPart := 12345;
if not SetFileInformationByHandle(Dest, FileEndOfFileInfo, @eof, SizeOf(eof)) then RaiseLastOSError;
finally
CloseHandle(Dest);
end;
end;
Bookmarks