Results 1 to 4 of 4

Thread: SetFileInformationByHandle foutmelding

  1. #1

    SetFileInformationByHandle foutmelding

    Hi,

    Bij het uitvoeren van SetFileInformationByHandle krijg ik bij RaiseLastOSError de melding met code 1.

    Code:
    var
      Dest : Thandle; 
      eof: FILE_END_OF_FILE_INFO;
    begin
      Dest := CreateFile(PChar(DestName), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING, 0);
    
      eof.EndOfFile.QuadPart := 12345;
      if not SetFileInformationByHandle(Dest, FileEndOfFileInfo, @eof, SizeOf(eof)) then RaiseLastOSError;
    Is de aanroep niet goed? Wellicht heeft dit met FILE_FLAG_NO_BUFFERING te maken?

  2. #2
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Voor ik SetFileInformationByHandle uitzoek, je kijkt helemal niet wat CreateFile precies in Dest zet. Dat kán INVALID_HANDLE_VALUE zijn, en dat is dan inderdaad een ongedige waarde om aan andere calls door te geven...

  3. #3
    Had even een klein stukje code geplaatst.

    Code:
    Dest := CreateFile(PChar(DestName), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING, 0);
    if Dest = INVALID_HANDLE_VALUE then RaiseLastOSError;
    DestName is een bestand. Ik zie dat dit aangemaakt en gevuld wordt.

    Alleen bij SetFileInformationByHandle gaat het fout.

  4. #4
    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;

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •