Как использовать ManagementObjectSearcher в Delphi? - PullRequest
0 голосов
/ 09 сентября 2010

Я нашел в интернете, но не понял, как я могу использовать ManagementObjectSearcher в Delphi.Мой главный вопрос, какой файл я должен добавить в «использует».

Я нашел один код , но не могу запустить его в моей системе.

Ответы [ 2 ]

5 голосов
/ 09 сентября 2010

Химадри, код, на который вы ссылаетесь, использует ManagementObjectSearcher в Delphi Prism, ManagementObjectSearcher - это класс .Net для получения информации о WMI.вы можете получить доступ к WMI из delphi, используя 3 альтернативы.

1) импортировать Microsoft WMIScripting Library из Компонента-> Импортировать компонент, а затем выберите Импорт библиотеки типов.

program WMI_Test;

{$APPTYPE CONSOLE}

uses
  ActiveX,
  Variants,
  SysUtils,
  WbemScripting_TLB in '..\..\..\Documents\RAD Studio\5.0\Imports\WbemScripting_TLB.pas';//


Procedure AccessWMI;
var
  WMIServices : ISWbemServices;
  Root        : ISWbemObjectSet;
  Item        : Variant;
begin
  WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil);
  Root  := WMIServices.ExecQuery('Select Caption FROM Win32_OperatingSystem','WQL', 0, nil);
  Item := Root.ItemIndex(0);
  Writeln(VarToStr(Item.Caption));
end;


begin
  try
    CoInitialize(nil);
    AccessWMI;
    Readln;
    CoUninitialize;
  except
    on E:Exception do
    Begin
        CoUninitialize;
        Writeln(E.Classname, ': ', E.Message);
        Readln;
    End;
  end;
end.

2) используйтеПозднее связывание COM

program WMI_Test;

{$APPTYPE CONSOLE}

uses
  SysUtils
  ,ActiveX
  ,ComObj
  ,Variants;


Procedure AccessWMI;
var
  objWMIService : OLEVariant;
  colItems      : OLEVariant;
  colItem       : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;

  function GetWMIObject(const objectName: String): IDispatch;
  var
    chEaten: Integer;
    BindCtx: IBindCtx;
    Moniker: IMoniker;
  begin
    OleCheck(CreateBindCtx(0, bindCtx));
    OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
  end;

begin
  objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
  colItems      := objWMIService.ExecQuery('SELECT Caption FROM Win32_OperatingSystem','WQL',0);
  oEnum         := IUnknown(colItems._NewEnum) as IEnumVariant;
  if oEnum.Next(1, colItem, iValue) = 0 then
  Writeln(VarToStr(colItem.Caption));
end;


begin
 try
    CoInitialize(nil);
    try
      AccessWMI;
      Readln;
    finally
    CoUninitialize;
    end;
 except
    on E:Exception do
    Begin
        Writeln(E.Classname, ': ', E.Message);
        Readln;
    End;
  end;
end.

3) с использованием библиотеки WMI, например библиотеки компонентов GLibWMI VCL

alt text

, вы можете найти несколькообразцы в СО о WMI и Delphi

1 голос
/ 09 сентября 2010

Другой вариант - использовать личность Delphi 2007 .Net (если у вас есть RadStudio 2007), которая основана на .NET Framework 2.0

проверьте этот образец для доступа к ManagementObjectSearcher из консольного приложения Delphi 2007 .Net.

program WmiTest;
{$APPTYPE CONSOLE}
uses
  System.Management,
  SysUtils;
var
Searcher   : ManagementObjectSearcher ;
Collection : ManagementObjectCollection;
iter       : ManagementObjectCollection.ManagementObjectEnumerator;
WmiObject  : ManagementObject;
begin
  try
    Searcher  :=ManagementObjectSearcher.Create('SELECT Caption FROM Win32_OperatingSystem');
    Collection:=Searcher.Get();
    iter:=Collection.GetEnumerator;
    while(iter.MoveNext()) do
    begin
      WmiObject:=ManagementObject(iter.Current);
      Writeln(WmiObject['Caption']);
    end;
    Readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
...