J'essaie de lire des informations de GPU-Z mémoire partagée, mais je fais quelque chose de mal. J'ai réussi à traduire la structure de mémoire partagée affichée sur les forums TechPowerUp. Je peux lire tous les GPUZ_RECORD
mais pas le GPUZ_SENSOR_RECORD
. Toute aide sera appréciée. Je vous remercie!lecture mémoire partagée GPU-Z
EDIT PLUS TARD I:
si j'utilise packet record
à la place i don `t obtenir plus AV, mais je ne peux toujours pas obtenir les informations des capteurs.
LATER EDIT II:
Si i est lu pour la data
de 0 à 128 (129 éléments), l'élément 128 est le premier capteur et i peut voir les données correctement. :(
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() est une petite procédure définie comme ceci:
procedure log(vData: array of Variant);
Alors GPU-Z est un programme de référence et vous accédez à la mémoire partagée via un fichier mappé en mémoire? Un peu de contexte rendrait votre question un peu moins mystérieuse. Vous vous attendez vraiment à ce que les gens ici comprennent ce dont vous parlez sans explication? Aidez les autres à vous aider. –
Eh bien, je pensais GPU-Z est un programme d'information de carte vidéo très bien connu, semble que mon hypothèse était erronée, je suis désolé. Mon problème est que je ne peux pas lire le droit 'GPUZ_SENSOR_RECORD' pour une raison quelconque. Peut-être que je n'ai pas traduit la disposition de la mémoire partagée correctement. –