чтение GPU-Z разделяемой памяти - PullRequest
0 голосов
/ 03 июля 2011

Я пытаюсь прочитать информацию из GPU-Z общей памяти, но я делаю что-то не так.Мне удалось перевести структуру разделяемой памяти, размещенную на форумах TechPowerUp .Я могу прочитать все GPUZ_RECORD, но не GPUZ_SENSOR_RECORD.Любая помощь будет оценена.Спасибо!

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ I:

если я использую packet record, вместо этого я больше не получаю AV, но я все еще не могу получить датчикиinfo.

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ II:

Если я прочитал data от 0 до 128 (129 элементов), то элемент 128 является первым датчиком, а яможете видеть данные правильно.:(

const
  MAX_RECORDS = 128;

GPUZ_RECORD = record
  key: array[0..255] of WChar;
  value: array[0..255] of WChar;
end;

GPUZ_SENSOR_RECORD = record
  name: array[0..255] of WChar;
  units: array[0..7] of WChar;
  digits: Cardinal;
  value: double;
end;

GPUZ_SH_MEM = record
  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;

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

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;

log () - это небольшая процедура, определенная так:

procedure log( vData: array of Variant );

Ответы [ 2 ]

0 голосов
/ 04 июля 2011

хорошо, друг помог мне обнаружить ошибку в моем коде, так как я подозревал, что мой перевод не безупречен, поэтому я перенесу исправленный код на случай, если кому-то будет интересно.

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; 
0 голосов
/ 04 июля 2011

Это, скорее всего, проблема с выравниванием структуры или переводом паскаля API / struct. Вы проверили SizeOf (GPUZ_SENSOR_RECORD) в C и посмотрите, соответствует ли он sizeof (GPUZ_SENSOR_RECORD) в паскале? Вы пытались изменить выравнивание?

...