Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2012, 17:57   #1
NaumOff
Пользователь
 
Регистрация: 25.07.2011
Сообщений: 48
По умолчанию Температура жесткого диска

Доброго времени суток. Много лет курю этот форум и до недавнего времени всю нужную инфу находил здесь и в гугле. Но вот теперь столкнулся с непреодолимой проблемой.
Надо мониторить температуру жесткого диска ноутбука. Готовых утилит море, но хочу свою с блек-джеком и шлюхами. Быстрый поиск показал, что получение SMART данных подробно описано и легко реализуемо, но только для дисков подключенных в режиме IDE. Все мои же диски используют механизм AHCI, при котором стандартные методы чтения SMART данных не работают. Столкнулся с тем, что инфы об этом нет, и как предположили на одном из форумов нет потому, что подобные программы используется в коммерческих целях и программеры не желают делиться результатами своих трудов. Посему прошу помощи у уважаемых знатоков.
NaumOff вне форума Ответить с цитированием
Старый 15.03.2012, 01:35   #2
NaumOff
Пользователь
 
Регистрация: 25.07.2011
Сообщений: 48
По умолчанию

К сожалению никто мне так и не ответил, хотя казалось бы задача обыденная. Глянув в сторону утилит мониторинга мне показалось, что все они юзают могучий WMI. В его сторону и решил копать. На Королевстве Delphi нашлась отличная статья про дружбу WMI и Delphi, на основе которой я и набросал код своей утилитки.
Код:
uses ..., ActiveX, dialogs, OleServer, WbemScripting_TLB;
...
var    Form1: TForm1;
        StrValue: string;
...
procedure TForm1.btn1Click(Sender: TObject);
var
  Service:             ISWbemServices;
  ObjectSet:          ISWbemObjectSet;
  SObject:             ISWbemObject;
  PropSet:             ISWbemPropertySet;
  SProp:               ISWbemProperty;
  PropEnum, Enum:   IEnumVariant;
  TempObj:             OleVariant;
  Value:                 Cardinal;
begin
  Service:= SWbemLocator1.ConnectServer('.', 'root\Wmi', '', '', '', '', 0, nil);
  SObject:= Service.Get('MSStorageDriver_ATAPISmartData', wbemFlagUseAmendedQualifiers, nil);
  ObjectSet:= SObject.Instances_(0, nil);
  Enum:= (ObjectSet._NewEnum) as IEnumVariant;
  while (Enum.Next(1, TempObj, Value) = S_OK) do
      begin
        SObject:= IUnknown(TempObj) as SWBemObject;
        PropSet:= SObject.Properties_;
        PropEnum:= (PropSet._NewEnum) as IEnumVariant;
      // начинаю перебирать свойства
        while (PropEnum.Next(1, TempObj, Value) = S_OK) do
            begin
              SProp:= IUnknown(TempObj) as SWBemProperty;
              if SProp.Name = 'VendorSpecific' then
                begin
                   ShowProp(SProp);
                  // ShowMessage(StrValue);
                   mmo1.Lines.Add(StrValue);
                end;
            end;
      end; { while }
end;

procedure TForm1.ShowProp(SProp: ISWbemProperty);
var
  Count: Cardinal;
begin
  StrValue:= '';
  if VarIsNull(SProp.Get_Value) then
    StrValue:= '<empty>'
  else
    case SProp.CIMType of
//******************************************************************//
      wbemCimtypeUint8, wbemCimtypeSint8, wbemCimtypeUint16, wbemCimtypeSint16,
      wbemCimtypeUint32, wbemCimtypeSint32, wbemCimtypeSint64:
      if VarIsArray(SProp.Get_Value) then
      begin
        if VarArrayHighBound(SProp.Get_Value, 1) > 0 then
          for Count:= 1 to VarArrayHighBound(SProp.Get_Value, 1) do
            StrValue:= StrValue + ' ' + IntToStr(SProp.Get_Value[Count]);
      end
      else
        StrValue:= IntToStr(SProp.Get_Value);
//******************************************************************//
      wbemCimtypeReal32, wbemCimtypeReal64:
        StrValue:= FloatToStr(SProp.Get_Value);
//******************************************************************//
      wbemCimtypeBoolean:
        if SProp.Get_Value then
          StrValue:= 'True'
        else
          StrValue:= 'False';
//******************************************************************//
        wbemCimtypeString, wbemCimtypeUint64:
          if VarIsArray(SProp.Get_Value) then
          begin
            if VarArrayHighBound(SProp.Get_Value, 1) > 0 then
              for Count := 1 to VarArrayHighBound(SProp.Get_Value, 1) do
                StrValue:= StrValue + ' ' + SProp.Get_Value[Count];
          end
          else
            StrValue:=  SProp.Get_Value;
//******************************************************************//
        wbemCimtypeDatetime:
          StrValue:=  SProp.Get_Value;
//******************************************************************//
        wbemCimtypeReference:
        begin
//
        end;
//******************************************************************//
          wbemCimtypeChar16:
            StrValue:= '16-bit char';
//******************************************************************//
          wbemCimtypeObject:
            StrValue:= 'CIM Object';
//******************************************************************//
      else
        MessageBox(0, PChar('Unknown type'), PChar(Form1.Caption), MB_OK);
    end; {case}

end;
Как итог в Memo имеем массив, представляющий из себя SMART-данные.
NaumOff вне форума Ответить с цитированием
Старый 02.04.2012, 19:17   #3
NaumOff
Пользователь
 
Регистрация: 25.07.2011
Сообщений: 48
По умолчанию

Где то в коде выше происходит утечка памяти. Кто нибудь видит?
NaumOff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Востановление жесткого диска Аватар Компьютерное железо 0 27.03.2011 11:26
разметка жесткого диска Sabin4ik Компьютерное железо 7 24.02.2011 01:58
Температура жесткого диска evgenii0494 Компьютерное железо 10 11.08.2010 14:45
Объем жесткого диска buka_14 Помощь студентам 1 16.04.2009 20:03
Обследование жесткого диска! Rembo Компьютерное железо 6 11.08.2008 09:14