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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2012, 11:27   #1
Robin_
Пользователь
 
Регистрация: 02.05.2008
Сообщений: 66
Вопрос WMI без установки SDK

Всем привет!
Можно ли использовать WMI без установки SDK?
Если да то как?

Хотел использовать Win32_DiskDrive параметры Caption, Index, Size. Вылазит куча ошибок, примеров в Инете много но все работают с компонентом TSWbemLocator. Подключал к проекту WbemScripting_TLB, не помогло.

Может у кого есть рабочий пример использования WMI
Robin_ вне форума Ответить с цитированием
Старый 29.08.2012, 12:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вылазит куча ошибок
Каких? может не в WMI проблема а в непонимании твоем сего инструмента...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.08.2012, 13:31   #3
Robin_
Пользователь
 
Регистрация: 02.05.2008
Сообщений: 66
По умолчанию

Вроде все как понял, собрал код, но не могу все диски обойти кто поможет????

Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WbemScripting_TLB, ActiveX;


type
  TForm2 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
    SWbemLocator1: SWbemLocator;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}


procedure TForm2.Button1Click(Sender: TObject);
var
  Service: ISWbemServices;
  ObjectSet: ISWbemObjectSet;
  sl,pl : TStringList;
  i:integer;
  wmiClass, selectList : string;
  propName : string;
  propValue : string;
  varProp : oleVariant;
  obj : ISWbemObject;
  varEnum : IEnumVariant;
  varObj : oleVariant;
  fetched : cardinal;
begin
  SWbemLocator1 := CoSWbemLocator.Create();
  Service := SWbemLocator1.ConnectServer('.','root\cimv2','','','','',0,nil);
  SWbemLocator1 := nil;
  Memo1.Clear;
  sl := TStringList.Create;
  pl := TStringList.Create;
  sl.Values['Win32_DiskDrive'] := 'Index, Model, Size';
    for i:=0 to sl.Count - 1 do
      begin
        wmiClass  := sl.Names[i];
        selectList := sl.ValueFromIndex[i];
        pl.CommaText := selectList;

        objectSet :=service.ExecQuery('select '+ selectList + ' from ' + wmiClass,'WQL', wbemFlagReturnImmediately and wbemFlagForwardOnly,nil);

        varEnum := objectSet._NewEnum as IEnumVariant;
        varEnum.Next(1,varObj,fetched);
        obj := IUnknown(varObj) as ISWbemObject;
         for propName in pl do
          begin
            varProp := obj.Properties_.Item(propName,0);
            if not varIsNull(varProp) then
               propValue := varToStr(varProp)
            else
               propValue := '';

            Memo1.Lines.Add(propName + ' ' + propValue);
          end;
      end;
      sl.Free;
      pl.Free;
end;

end.
Robin_ вне форума Ответить с цитированием
Старый 29.08.2012, 13:33   #4
Robin_
Пользователь
 
Регистрация: 02.05.2008
Сообщений: 66
По умолчанию

Точнее эту строку подправить нужно
Код:
objectSet :=service.ExecQuery('select '+ selectList + ' from ' + wmiClass,'WQL', wbemFlagReturnImmediately and wbemFlagForwardOnly,nil);
Robin_ вне форума Ответить с цитированием
Старый 29.08.2012, 14:56   #5
Robin_
Пользователь
 
Регистрация: 02.05.2008
Сообщений: 66
По умолчанию

Спасибо тем кто ХОТЕЛ помочь

Данный код выводит все HDD модель и размер (до 6 HDD)

Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WbemScripting_TLB, ActiveX;


type
  TForm2 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
    SWbemLocator1: SWbemLocator;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  Service: ISWbemServices;
  ObjectSet: ISWbemObjectSet;
  sl,pl : TStringList;
  i,ii:integer;
  wmiClass, selectList : string;
  propName : string;
  propValue : string;
  varProp : oleVariant;
  obj : ISWbemObject;
  varEnum : IEnumVariant;
  varObj : oleVariant;
  fetched : cardinal;
begin
  SWbemLocator1 := CoSWbemLocator.Create();
  Service := SWbemLocator1.ConnectServer('.','root\cimv2','','','','',0,nil);
  SWbemLocator1 := nil;
  Memo1.Clear;
  sl := TStringList.Create;
  pl := TStringList.Create;
  sl.Values['Win32_DiskDrive'] := 'Index, Model, Size';

    for i:=0 to sl.Count - 1 do
      begin
        wmiClass  := sl.Names[i];
        selectList := sl.ValueFromIndex[i];
        pl.CommaText := selectList;

        objectSet :=service.ExecQuery('select '+ selectList + ' from ' + wmiClass,'WQL', wbemFlagReturnImmediately and wbemFlagForwardOnly,nil);
        varEnum := objectSet._NewEnum as IEnumVariant;

        for ii := 0 to 5 do
          Begin
             if varEnum.Next(1,varObj,fetched)= S_OK  then
                begin
                  obj := IUnknown(varObj) as ISWbemObject;
                   for propName in pl do
                      begin
                        varProp := obj.Properties_.Item(propName,0);
                          if not varIsNull(varProp) then
                           propValue := varToStr(varProp)
                          else propValue := '';
                        Memo1.Lines.Add(propName + ' ' + propValue);
                      end;
                END;
          End;
      end;
      sl.Free;
      pl.Free;
end;

end.
Robin_ вне форума Ответить с цитированием
Старый 29.08.2012, 19:49   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Открой для себя WMI Delphi Code Creator. Это мастер, который сгенерирует тебе корректный и грамотный код.

Вот пример сгенерированного им кода:

Код:
program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;
  
procedure  GetWin32_DiskDriveInfo;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('BytesPerSector      %d',[Integer(FWbemObject.BytesPerSector)]));// Uint32
    Writeln(Format('Caption             %s',[String(FWbemObject.Caption)]));// String
    Writeln(Format('DeviceID            %s',[String(FWbemObject.DeviceID)]));// Array of String
    Writeln(Format('FirmwareRevision    %s',[String(FWbemObject.FirmwareRevision)]));// Array of String
    Writeln(Format('Index               %d',[Integer(FWbemObject.Index)]));// Uint32
    Writeln(Format('InterfaceType       %s',[String(FWbemObject.InterfaceType)]));// String
    Writeln(Format('Manufacturer        %s',[String(FWbemObject.Manufacturer)]));// String
    Writeln(Format('MediaLoaded         %s',[String(FWbemObject.MediaLoaded)]));// Boolean
    Writeln(Format('MediaType           %s',[String(FWbemObject.MediaType)]));// String
    Writeln(Format('Model               %s',[String(FWbemObject.Model)]));// String
    Writeln(Format('Name                %s',[String(FWbemObject.Name)]));// String
    Writeln(Format('SerialNumber        %s',[String(FWbemObject.SerialNumber)]));// String
    Writeln(Format('Size                %s',[String(FWbemObject.Size)]));// Uint64
    Writeln(Format('Status              %s',[String(FWbemObject.Status)]));// String
    Writeln(Format('SystemName          %s',[String(FWbemObject.SystemName)]));// String
	    
    Writeln('');
    FWbemObject:=Unassigned;
  end;
end;

begin
 try
    CoInitialize(nil);
    try
      GetWin32_DiskDriveInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;      
end.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось Stilet; 29.08.2012 в 20:37.
GunSmoker вне форума Ответить с цитированием
Старый 04.09.2012, 09:40   #7
Robin_
Пользователь
 
Регистрация: 02.05.2008
Сообщений: 66
По умолчанию

Спасибо разбираюсь! +1
Robin_ вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ConnectionString без установки Sql Server 2008 R2 Aydan Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 1 03.09.2012 22:16
ConnectionString без установки Sql Server 2008 R2 Aydan C# (си шарп) 3 09.08.2012 14:11
Как сделать чтобы бд работала без установки Delphi Ol'ga БД в Delphi 7 05.06.2012 16:22
Температура процессора без использования wmi. the_deer_one Общие вопросы C/C++ 0 24.08.2010 11:54
MS Access без установки Offece DoGFoX Windows 1 06.08.2010 08:42