Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.09.2013, 20:34
DigitalBrain DigitalBrain вне форума
Прохожий
 
Регистрация: 20.09.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию получить показания датчиков температуры пк

Здравствуйте!
Сижу уже день терзая гугл, но абсолютно ничего работающего не нашел..Все что не пробовал с wmi не работает: или провайдера не существует или пустой список возвращает..
Как же все таки вытащить инфу о температуре компонентов пк? Кучи же подобного софта , казалось бы тривиальная задача, но на деле...
Вообще интересуют: HDD,System,CPU и GPU..
Вот этот код возвращает пустой список, пробовал на ноутбуках с разных эпох, результат тот же...Windows7/XP
Код:
 WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil);
  Root  := WMIServices.ExecQuery('Select * FROM Win32_TemperatureProbe','WQL', 0, nil);
  for I := 0 to Root.Count - 1 do
  begin
    Item := Root.ItemIndex(I);
      Writeln('Accuracy                        '+VarToStr(Item.Accuracy));
      Writeln('Availability                    '+VarToStr(Item.Availability));
      Writeln('Caption                         '+Item.Caption);
      Writeln('Config Manager Error Code       '+VarToStr(Item.ConfigManagerErrorCode));
      Writeln('Config Manager User Config      '+VarToStr(Item.ConfigManagerUserConfig));
      Writeln('Creation Class Name             '+VarToStr(Item.CreationClassName));
      Writeln('Current Reading                 '+VarToStr(Item.CurrentReading));
      Writeln('Description                     '+VarToStr(Item.Description));
      Writeln('Device ID                       '+VarToStr(Item.DeviceID));
      Writeln('Error Cleared                   '+VarToStr(Item.ErrorCleared ));
      Writeln('Error Description               '+VarToStr(Item.ErrorDescription));
      Writeln('Install Date                    '+VarToStr(Item.InstallDate));
      Writeln('Is Linear                       '+VarToStr(Item.IsLinear));
      Writeln('Last Error Code                 '+VarToStr(Item.LastErrorCode));
      Writeln('Lower Threshold Critical        '+VarToStr(Item.LowerThresholdCritical));
      Writeln('Lower Threshold Fatal           '+VarToStr(Item.LowerThresholdFatal));
      Writeln('Lower Threshold NonCritical     '+VarToStr(Item.LowerThresholdNonCritical));
      Writeln('Max Readable                    '+VarToStr(Item.MaxReadable));
      Writeln('Min Readable                    '+VarToStr(Item.MinReadable));
      Writeln('Name                            '+VarToStr(Item.Name));
      Writeln('Nominal Reading                 '+VarToStr(Item.NominalReading));
      Writeln('Normal Max                      '+VarToStr(Item.NormalMax));
      Writeln('Normal Min                      '+VarToStr(Item.NormalMin ));
      Writeln('PNP Device ID                   '+VarToStr(Item.PNPDeviceID));
      Writeln('Power Management Capabilities   '+VarToStr(Item.PowerManagementCapabilities));
      Writeln('Power Management Supported      '+VarToStr(Item.PowerManagementSupported));
      Writeln('Resolution                      '+VarToStr(Item.Resolution));
      Writeln('Status                          '+VarToStr(Item.Status));
      Writeln('Status Info                     '+VarToStr(Item.StatusInfo));
      Writeln('System Creation Class Name      '+VarToStr(Item.SystemCreationClassName));
      Writeln('System Name                     '+VarToStr(Item.SystemName));
      Writeln('Tolerance                       '+VarToStr(Item.Tolerance));
      Writeln('Upper Threshold Critical        '+VarToStr(Item.UpperThresholdCritical));
      Writeln('Upper Threshold Fatal           '+VarToStr(Item.UpperThresholdFatal));
      Writeln('Upper Threshold NonCritical     '+VarToStr(Item.UpperThresholdNonCritical));
      Writeln('');
  end;
end;
Ответить с цитированием
  #2  
Старый 25.09.2013, 21:56
DigitalBrain DigitalBrain вне форума
Прохожий
 
Регистрация: 20.09.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
Печаль

Эх..видно совсем хардкорная тема оказалась=\

Пока настругал только функцию для чтения температуры HDD:
Код:
Function GetHDDTemperarure(DriveIndex:byte;out Temperature:SmallInt):Boolean;
Type
 TSmartData = Array [0..$20F] of Byte;
Var
 Op: TSmartData;
 H: Cardinal;
 br: DWORD;
begin
 Result:=false;
 try
  H:= CreateFile(PChar('\\.\PhysicalDrive'+IntToStr(DriveIndex)),$C0000000,3,nil, 3,0,0);
  DeviceIoControl(H,$0007C088,@Ip,$20,@Op,$210,br,nil);
  CloseHandle(H);
  Temperature:=Op[$A8]*$FF+Op[$A7];
  if(Temperature>-50) And (Temperature<200) then
  begin
   Result:=true;
  end;
 except
 end;
end;

заставить WMI хоть что то показать не удалось на 4 разных машинах...в TermalZone есть пара значений, но ни одной температуре они не соответствуют..да и они всегда константные(
Нарыл программу http://openhardwaremonitor.org/ , которая судя по доках может экспортировать свои данные в WMI...пока не удалось ее вкурить...
Куча бесплатного подобного софта, и ни одного примера исходного кода, неужели они напрямую по портам к контроллеру обращаются Оо за 10 лет как минимум должен был появится не один велосипед-библиотека для доступа к датчикам материнки, но глухо...
Ответить с цитированием
  #3  
Старый 25.09.2013, 22:21
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Глянь дизассемблером, как те программы работают.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #4  
Старый 25.09.2013, 22:35
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от DigitalBrain
...Все что не пробовал с wmi не работает...
Стесняюсь спросить - а у вас сервис WMI в системе вообще запущен? Он по умолчанию отключен, да и в делфи, как я понял, нужно ещё ОСХ-компонент доустановить.
Ответить с цитированием
  #5  
Старый 25.09.2013, 22:35
DigitalBrain DigitalBrain вне форума
Прохожий
 
Регистрация: 20.09.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Глянь дизассемблером, как те программы работают.
К сожалению, я не такой джедай с ASMом под x86 чтоб осилить реинжениринг...мой уровень там- пару функций аля хеловорд..
Да и кажись исходик OpenHardwareMonitor как бы нашел...но блин опять же не мои родные языки..но уж лучше чем читать тонну asmа..
https://code.google.com/p/open-hardw.../ATI/ATIGPU.cs
Ответить с цитированием
  #6  
Старый 26.09.2013, 10:07
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

DigitalBrain, - вот нашёл на просторах интернета, у меня работает.
Показыват температуру Проца и матери.
t_sensor.zip
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #7  
Старый 26.09.2013, 16:26
DigitalBrain DigitalBrain вне форума
Прохожий
 
Регистрация: 20.09.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от SCrat.ORS
DigitalBrain, - вот нашёл на просторах интернета, у меня работает.
Показыват температуру Проца и матери.
Вложение 4085

фиг там...ну у меня выбивает исключение EPrivilege: Privileged instruction от имени админа..что на win7 64bit что на XP 32bit...результат тот же..(
Ответить с цитированием
  #8  
Старый 26.09.2013, 16:33
DigitalBrain DigitalBrain вне форума
Прохожий
 
Регистрация: 20.09.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Стесняюсь спросить - а у вас сервис WMI в системе вообще запущен? Он по умолчанию отключен, да и в делфи, как я понял, нужно ещё ОСХ-компонент доустановить.

Да...включен. WMI как бы работает, но провайдеры датчиков температуры и скорости кулеров например не работают..
Ну а библиотека типов для работы с wmi конечно импортирована, да и тестил я для чистоты эксперимента чужим ехе для просмотра wmi
Вложения
Тип файла: zip GetHardwareInfo_Exe.zip (14.6 Кбайт, 89 просмотров)
Ответить с цитированием
  #9  
Старый 26.09.2013, 16:34
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

у меня такая же ошибка.


считал S.M.A.R.T через MSStorageDriver_ATAPISmartData, параметр HDA temperature (194) есть, но он не меняется


добавлено позже
ой, я перепутал датчик. показывает такую же температуру как и HWiNFO32.exe. как бы теперь температуру диска повысить...
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 26.09.2013 в 16:40.
Ответить с цитированием
  #10  
Старый 26.09.2013, 20:03
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
фиг там...ну у меня выбивает исключение EPrivilege: Privileged instruction от имени админа..что на win7 64bit что на XP 32bit...результат тот же..(
Понятное дело - команды in/out процессор не даст исполнять ни с какими правами админа, если в таблице IO портов (кажись в TSS) доступ запрещен. Потому что права админа - понятие ОС, а аппаратная защита - процессора. Скорее всего для работы нужен еще тот самый giveo.sys - но не известно, насколько он работает на современных системах. Может его неспроста не включают в стандартную поставку Windows.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 26.09.2013 в 21:28.
Ответить с цитированием
  #11  
Старый 27.09.2013, 09:17
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

для HDD:
Код:
procedure GetTemperature(var Airflow, HDA, Temperature: Integer);
var
  objLocator: ISWbemLocator;
  objServices: ISWbemServices;
  objObjectSet: ISWbemObjectSet;
  EnumSet: IEnumVariant;
  SetVar: OleVariant;
  Fetched: Cardinal;
  objObject: ISWbemObject;
  objProperty: ISWbemProperty;
  v: OleVariant;
  i: Integer;
begin
  Airflow:=-1;
  HDA:=-1;
  Temperature:=-1;
  objLocator:=CreateComObject(CLASS_SWbemLocator) as ISWbemLocator;
  objServices:=objLocator.ConnectServer('', 'root\WMI', '', '', '', '', 0, nil);
  objObjectSet:=objServices.ExecQuery('select * from MSStorageDriver_ATAPISmartData', 'WQL', 0, nil);
  EnumSet:=IUnknown(objObjectSet._NewEnum) as IEnumVariant;
  while EnumSet.Next(1, SetVar, Fetched)=S_OK do
  begin
    objObject:=IUnknown(SetVar) as ISWbemObject;
    objProperty:=objObject.Properties_.Item('VendorSpecific', 0);
    if (objProperty.CIMType=wbemCimtypeUint8) and objProperty.IsArray then
    begin
      v:=objProperty.Get_Value;
      for i:=0 to ((VarArrayHighBound(v, 1)-1) div 12)-1 do
      begin
        if v[2+i*12]=190 then Airflow:=v[2+i*12+3];
        if v[2+i*12]=194 then HDA:=v[2+i*12+3];
        if v[2+i*12]=231 then Temperature:=v[2+i*12+3];
      end;
    end;
  end;
end;
только нужно исправить код для нескольких жестких дисков, иначе будет выдавать для последнего.

http://zalil.ru/34744720
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо NumLock за это полезное сообщение:
DigitalBrain (28.09.2013), drdead84 (10.03.2015), kycuj (03.07.2016)
  #12  
Старый 28.09.2013, 01:18
DigitalBrain DigitalBrain вне форума
Прохожий
 
Регистрация: 20.09.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Такс...2 дня трудов по чтению доков..перевода C++ хедеров ADL под делфи...и..таки удалось вытянуть инфу о температуре видеокарты от amd (ну и чуть еще инфы раз полез уже туда) , собственно только amd видео карты у меня везде и стоят..
По идее и инфу о скорости кулера видеокарты должно получать, но у меня нет ни одной с кулером- не геймер я особый: люблю тишину пассивного охлаждения) да и карточки только 2-х видов у меня(-

Так что, люди добрые, хотелось бы узнать у владельцев amd карточек работает ли сей хело-ворлдовский ехешник собранный в lazarus?)

осталось получить датчики с материнки цп/система..думаю тут проще будет)
Вложения
Тип файла: zip GPU.zip (126.2 Кбайт, 176 просмотров)
Ответить с цитированием
  #13  
Старый 29.09.2013, 08:58
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #14  
Старый 29.09.2013, 17:53
DigitalBrain DigitalBrain вне форума
Прохожий
 
Регистрация: 20.09.2013
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
ой...нежданчик...win32 Оо во времена нетбуков с 10гб озу Оо)
нус тогда под х32 версия
Вложения
Тип файла: zip GPUx32.zip (117.3 Кбайт, 134 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter