delphi 如何分配内部包含动态数组的Win32结构?

yruzcnhs  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(149)

Delphi 11 WinNt(10)正在与范围异常作斗争。
我可以通过禁用范围检查{$R-}来“解决”问题,但有人知道正确的新方法吗?
这个结构应该是定义。我从一个3. Party和Microsoft Win32联机帮助中得到它,但没有为我提供定义。我猜数组[0..0]对于动态长度结果是不正确的...

SYSTEM_PROCESSOR_PERFORMANCE_DISTRIBUTION = record
  ProcessorCount: ULONG;
  Offsets: array[0..0] of ULONG; // this would be the dynamic Part
end;

如果我想使用我的结构,我只能使用范围错误前的第一个偏移[0]条目。如预期...但如何正确分配该结构?

function QueryProcessorPerformance(out ABuffer: PSystemProcessorPerformanceDistribution): boolean;
var
  status: NTSTATUS;
  buffer: Pointer absolute aBuffer; // Mapping my Pointer from aBuffer to local Pointer buffer
  bufferSize: ULong;
begin
  buffer  := nil;
  bufferSize:=0;
  status:=NtQuerySystemInformation(ProcessorPerformanceDistribution{Somenumber},buffer,bufferSize,@bufferSize);
  if (ULong(status) = STATUS_INFO_LENGTH_MISMATCH) then // Excepted
  begin
    AallocMem(buffer,bufferSize);
    status:=NtQuerySystemInformation(SystemProcessorPerformanceDistribution,buffer,bufferSize,@bufferSize);
    // from here on aBuffer has a Valid Count Value.
    if status = s_ok then
    begin
      // Acces to 
      aBuffer^.Offsets[0] is ok. aBuffer^.Offsets[1] Throws Range Check
    end;
  end;
  Result:=status=S_OK;
end;
to94eoyn

to94eoyn1#

目前, Delphi 11的答案是:

  • 根据大卫Heffernan的建议禁用范围检查

或者(在我看来)勇敢和

  • 从雷米Lebeau的解决方案开始走指针算术路线。

两者都起作用,我更喜欢范围检查版本。
再次感谢你们。

相关问题