Delphi 读取GPU-Z共享内存

Delphi 读取GPU-Z共享内存,delphi,memory,shared,Delphi,Memory,Shared,我试图从共享内存中读取信息,但我做错了什么。我已经设法翻译了论坛上发布的共享内存结构。我可以读取所有GPUZ\u记录,但不能读取GPUZ\u传感器记录。任何帮助都将不胜感激。谢谢大家! 稍后编辑I: 如果我改用数据包记录,我将无法再获得AV,但仍然无法获得传感器信息 后期编辑II: 如果我从0到128(129个元素)读取数据,则128个元素是第一个传感器,我可以正确查看数据:( //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我试图从共享内存中读取信息,但我做错了什么。我已经设法翻译了论坛上发布的共享内存结构。我可以读取所有
GPUZ\u记录
,但不能读取
GPUZ\u传感器记录
。任何帮助都将不胜感激。谢谢大家!

稍后编辑I:

如果我改用
数据包记录
,我将无法再获得AV,但仍然无法获得传感器信息

后期编辑II:

如果我从0到128(129个元素)读取
数据,则128个元素是第一个传感器,我可以正确查看数据:(

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

procedure TMainForm.readSensors;
var
  hMapFile: Thandle;
  sKey, sVal: string;
  GPUInfo: PGPUZ_SH_MEM;
  s, d: integer;
begin
  hMapFile := OpenFileMapping(FILE_MAP_READ, FALSE, 'GPUZShMem');
  if hMapFile <> 0 then begin
    log(['Mapping succesfully']);;
    GPUInfo := MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
//    ShowMessage(IntToStr(GetLastError));
    if GPUInfo <> nil then begin

       log([ GPUInfo^.version ]);
       log([ GPUInfo^.busy ]);
       log([ GPUInfo^.lastUpdate ]);

       log(['LOGING DATA ~~~~~~~~~~~~~~~~~~~~~~']);
       for d:= 0 to Pred(MAX_RECORDS) do begin

         sKey := GPUInfo^.data[d].key;
         sVal := GPUInfo^.data[d].value;    
         if sKey <> '' then log([d, '#: ', sKey, sVal ]);

       end;
       log(['LOGING SENSORS ~~~~~~~~~~~~~~~~~~~~']);
       for s:= 0 to Pred(MAX_RECORDS) do begin

         sKey := GPUInfo^.sensors[s].name; // i get an AV here when s:=127
         log([ 'Sensor ', s, '#: ', sKey ]);

//         sVal := TPN^.sensors[s].units;
//         log([ 'Unit: ', sVal ]);
//         log(['Digits: ', TPN^.sensors[s].digits ]);
//         log(['Value: ', TPN^.sensors[s].value ]);
       end;

    end else log([ 'Could not map that zone!' ]);

  end else begin
    log(['Could not find the zone for mapping...']);
    UnmapViewOfFile(GPUInfo);
    CloseHandle(hMapFile);
  end;
end;

这很可能是结构对齐或pascal API/struct转换问题。您是否检查了C中的SizeOf(GPUZ\U SENSOR\U记录)并查看它是否与pascal中的SizeOf(GPUZ\U SENSOR\U记录)匹配?您是否尝试更改对齐方式?

这很可能是结构对齐或pascal API/struct转换问题。您是否检查了SizeOf(GPUZ_SENSOR_RECORD)并查看它是否与pascal中的sizeof(GPUZ_SENSOR_RECORD)匹配?您是否尝试更改对齐方式?

好的,一位朋友帮助我发现了代码中的错误,因为我怀疑我的翻译并非完美无缺,所以我将移植更正后的代码,以防有人感兴趣

const
  MAX_RECORDS = 127; // <-- important [0..127] => 128 elements

GPUZ_RECORD = packed record // <-- all records must be packed
  key: array[0..255] of WChar;
  value: array[0..255] of WChar;
end;

GPUZ_SENSOR_RECORD = packed record // <-- all records must be packed
  name: array[0..255] of WChar;
  units: array[0..7] of WChar;
  digits: Cardinal;
  value: double;
end;

GPUZ_SH_MEM = packed record // <-- all records must be packed
  version : Cardinal;
  busy: Boolean;
  lastUpdate: Cardinal;
  data: array [0..MAX_RECORDS] of GPUZ_RECORD;
  sensors: array [0..MAX_RECORDS] of GPUZ_SENSOR_RECORD;
end;

PGPUZ_SH_MEM = ^GPUZ_SH_MEM; 
const
MAX_RECORDS=127;//128个元素

GPUZ_RECORD=packed RECORD/好的,一位朋友帮我发现了代码中的错误,因为我怀疑我的翻译并非完美无缺,所以我将移植更正后的代码,以防有人感兴趣

const
  MAX_RECORDS = 127; // <-- important [0..127] => 128 elements

GPUZ_RECORD = packed record // <-- all records must be packed
  key: array[0..255] of WChar;
  value: array[0..255] of WChar;
end;

GPUZ_SENSOR_RECORD = packed record // <-- all records must be packed
  name: array[0..255] of WChar;
  units: array[0..7] of WChar;
  digits: Cardinal;
  value: double;
end;

GPUZ_SH_MEM = packed record // <-- all records must be packed
  version : Cardinal;
  busy: Boolean;
  lastUpdate: Cardinal;
  data: array [0..MAX_RECORDS] of GPUZ_RECORD;
  sensors: array [0..MAX_RECORDS] of GPUZ_SENSOR_RECORD;
end;

PGPUZ_SH_MEM = ^GPUZ_SH_MEM; 
const
MAX_RECORDS=127;//128个元素

GPUZ_RECORD=packed RECORD//GPU-Z是一个基准程序,你通过一个内存映射文件访问共享内存?一点背景知识会让你的问题不那么神秘。你真的希望这里的人不需要解释就能明白你在说什么?帮助别人帮助你。嗯,我认为GPU-Z是一个非常好的知识视频卡信息程序,似乎我的假设是错误的,我很抱歉。我的问题是,出于某种原因,我无法正确读取
GPUZ\U传感器记录。可能我没有正确翻译共享内存布局。因此GPU-Z是一个基准程序,您通过内存映射文件访问共享内存?有点背景nd会让你的问题不那么神秘。你真的希望这里的人不经解释就能明白你在说什么?帮助他人帮助你。我认为GPU-Z是一个非常有名的视频卡信息程序,似乎我的假设是错误的,对不起。我的问题是我看不懂GPUZ传感器ECORD
出于某种原因是正确的。可能我没有正确翻译共享内存布局。这是我翻译C代码的问题,谢谢你的输入。这是我翻译C代码的问题,谢谢你的输入。
const
  MAX_RECORDS = 127; // <-- important [0..127] => 128 elements

GPUZ_RECORD = packed record // <-- all records must be packed
  key: array[0..255] of WChar;
  value: array[0..255] of WChar;
end;

GPUZ_SENSOR_RECORD = packed record // <-- all records must be packed
  name: array[0..255] of WChar;
  units: array[0..7] of WChar;
  digits: Cardinal;
  value: double;
end;

GPUZ_SH_MEM = packed record // <-- all records must be packed
  version : Cardinal;
  busy: Boolean;
  lastUpdate: Cardinal;
  data: array [0..MAX_RECORDS] of GPUZ_RECORD;
  sensors: array [0..MAX_RECORDS] of GPUZ_SENSOR_RECORD;
end;

PGPUZ_SH_MEM = ^GPUZ_SH_MEM;