如何分配一个Win32结构与动态数组里面?



Delphi 11winnt (10): using using Range Exception.

我可以"解决";然后问题通过禁用范围检查{$R-},但有人知道正确的新方法吗?

这个结构应该是定义。我从一个3得到的。Party和microsoft Win32联机帮助没有给我一个定义。我猜数组[0..]对于动态长度结果,

是不正确的。
SYSTEM_PROCESSOR_PERFORMANCE_DISTRIBUTION = record
ProcessorCount: ULONG;
Offsets: array[0..0] of ULONG; // this would be the dynamic Part
end;

如果我想使用我的结构,我只能使用第一个Offset[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;

目前对于Delphi 11的答案是:

  • 根据David Heffernan的建议禁用RangeCheck

或(在我心中)勇敢和

  • 从Remy Lebeau的解决方案中获取指针算术路由。

两者都可以,我更喜欢范围检查版本。

再次感谢你们。

最新更新