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;
1条答案
按热度按时间to94eoyn1#
目前, Delphi 11的答案是:
或者(在我看来)勇敢和
两者都起作用,我更喜欢范围检查版本。
再次感谢你们。