При работе с данными из GPU-Z через общую память, важно точно следовать структуре данных, которую предоставляет программа. Вопрос пользователя касается доступа к данным датчиков в GPU-Z, используя язык программирования Pascal, и возникновение ошибок при этом.
Описание проблемы
Пользователь столкнулся с проблемой при чтении данных датчиков из обшей памяти GPU-Z. Он смог перевести структуру обшей памяти, опубликованную на форумах TechPowerUp, но не может корректно обращаться к данным GPUZ_SENSOR_RECORD.
Решение проблемы
После нескольких попыток и обсуждения с сообществом, пользователь выяснил, что проблема заключалась в неправильном переводе структур данных из C в Pascal. Исправление заключалось в добавлении ключевого слова packed к определениям записей, что обеспечивает правильное выравнивание структур и их соответствие ожидаемым размерам.
const
MAX_RECORDS = 127; // Важно, [0..127] => 128 элементов
GPUZ_RECORD = packed record
key: array[0..255] of WChar;
value: array[0..255] of WChar;
end;
GPUZ_SENSOR_RECORD = packed record
name: array[0..255] of WChar;
units: array[0..7] of WChar;
digits: Cardinal;
value: double;
end;
GPUZ_SH_MEM = packed 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;
Важные замечания
Все записи должны быть определены с ключевым словом packed для корректного выравнивания.
Размер массива data и sensors в GPUZ_SH_MEM должен быть на единицу меньше, чем количество элементов, так как индексация начинается с нуля.
Пример кода для чтения данных датчиков
procedure TMainForm.ReadSensors;
var
hMapFile: THandle;
GPUInfo: PGPUZ_SH_MEM;
s, d: Integer;
begin
hMapFile := OpenFileMapping(FILE_MAP_READ, FALSE, 'GPUZShMem');
if hMapFile <> 0 then
begin
GPUInfo := MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
if GPUInfo <> nil then
begin
// Чтение данных датчиков
for s := 0 to Pred(MAX_RECORDS) do
begin
// Здесь должен быть код для чтения данных датчиков
// Убедитесь, что индексация соответствует реальным данным
end;
end
else
// Обработка ошибки при отображении файла
end;
else
// Обработка ошибки при открытии файла
end;
UnmapViewOfFile(GPUInfo);
CloseHandle(hMapFile);
end;
Приведенный выше пример кода является упрощенным и демонстрирует структуру процедуры чтения данных датчиков. Необходимо будет добавить реальную логику чтения и обработки данных, следуя правилам выравнивания и структуры данных GPU-Z.
Пользователь столкнулся с трудностями при попытке доступа к данным датчиков из программы GPU-Z, используя язык программирования Pascal, и обнаружил проблему в неправильном переводе структур данных, которую удалось решить путем корректного выравнивания с
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS