草庐IT

windows - 调用 FileRead 后的奇怪计数值

coder 2024-06-18 原文

我正在尝试将读取的字节数与传递给 FileRead 的计数进行比较这是 WinAPI 的包装器 ReadFile功能。

问题是我根据 ReadFromFile 过程的结构得到了不同的值(添加/减去的行都没有改变计数变量)。

如果你运行下面的代码,你会得到这个输出

FileHandle: 400
SizeOfFile: 8672
Current position: 8655
aCount before SetLength: 17
aCount before FileRead: 17
Number of bytes read: 17
aCount after FileRead: 2200
EAccessViolation: Access violation at address 0040C5BC in module 'Project7.exe'. Read of address C23C30BA

AV 是因为编译器在范围末尾释放了动态数组(并非总是如此)。 正如您在 FileRead 之后看到的 count == 2200 (在此之前我得到的是 0)。如果您注释掉第二个 API 调用或第二行,则计数是正确的

你能告诉我这是什么吗?我该如何解决?

program Project7;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, WinAPI.Windows, System.Classes;


procedure ReadFromFile(aFileHandle: THandle; aCount: Longint);
var
  aPosition, ReadRes: Int64;
  TmpBuffer: TBytes;
begin
  writeln('aCount before SetLength: ',aCount);
  SetLength(TmpBuffer, aCount);
  writeln('aCount before FileRead: ',aCount);
  ReadRes := FileRead(aFileHandle, TmpBuffer, aCount);
  Writeln('Number of bytes read: ', ReadRes);
  //aPosition := FileSeek(aFileHandle, 0, Ord(soCurrent)); // second API call
  //Writeln('Current position after read: ', aPosition);  // line two
  writeln('aCount after FileRead: ',aCount);
  if ReadRes <> aCount then
    //Raise Exception.Create('hi there');
 // DoWrite(TmpBuffer[0], aCount);
end;

var
  FFileHandle: THandle;
  aFileName: string;
  I1: Integer;
  aFilePhysicalSize: Int64;
  FPosition: Int64;
begin
  try
    aFileName := 'C:\Users\nacereddine\Desktop\ascii-table.gif';
    { TODO -oUser -cConsole Main : Insert code here }
    FFileHandle := CreateFile(PChar(aFileName), GENERIC_READ,
                                FILE_SHARE_READ, nil, OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL, 0);
    Writeln('FileHandle: ', FFileHandle);
    aFilePhysicalSize := FileSeek(FFileHandle, 0 , Ord(soEnd));
    Writeln('SizeOfFile: ', aFilePhysicalSize);
    FPosition := FileSeek(FFileHandle, aFilePhysicalSize - 17 , Ord(soBeginning));
    Writeln('Current position: ', FPosition);
    I1 := 17;
    ReadFromFile(FFileHandle, I1);

    readln;

  except

    on E: Exception do
    begin
    Writeln(E.ClassName, ': ', E.Message);
    readln;
    end;
  end;
end.

最佳答案

您正在使用带有未类型化第二个参数的过程 fileread 的版本:

TmpBuffer: TBytes;
...
ReadRes := FileRead(aFileHandle, TmpBuffer, aCount);

但在这种情况下,您应该取消引用动态数组,如 TmpBuffer[0]

来自您的帮助链接:

 //this version is used
 function FileRead(Handle: THandle; var Buffer; Count: LongWord): Integer;
 //perhaps you wanted that one:
 function FileRead(Handle: THandle; var Buffer: TBytes; Offset, Count: LongWord): Integer;

关于windows - 调用 FileRead 后的奇怪计数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48101374/

有关windows - 调用 FileRead 后的奇怪计数值的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  3. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  4. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  5. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  6. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby - 使用多个数组创建计数 - 2

    我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

  9. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  10. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

随机推荐