Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   TSWbemLocator not found (https://www.delphipraxis.net/153393-tswbemlocator-not-found.html)

msickel 31. Jul 2010 18:33

TSWbemLocator not found
 
Hallo,
Ich habe einen Stück Code im Netz gefunden und versuche diesen zum laufen zu bringen.

Ich habe die Microsoft WMI Scripting V1.2 Library bereits importiert, bekomme aber immer noch den Fehler TSWbemLocator not found.

Welche TypeLibary braucht es noch, bzw. was muss ich noch tun um diesen Fehler zu vermeiden?

Hier noch der Code.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    StatusBar1: TStatusBar;
    CheckBox1: TCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses WbemScripting_TLB, activex, comobj;

type TIWrapper=class
     public
       prop:ISWbemProperty;
       constructor Create(p:ISWbemProperty);
     end;

constructor TIWrapper.Create(p: ISWbemProperty);
begin
  prop:=p;
end;

procedure clear(Adapters:TStrings);
var i:integer;
begin
  for i:=1 to Adapters.Count do
    Adapters.Objects[i-1]:=nil;
  Adapters.Clear;
end;

function getPropValue(sprop:ISWbemProperty):string;
var sValue:string;
    count:integer;
begin
  sValue := '';
  if VarIsNull(SProp.Get_Value) then
    sValue := '<empty>'
  else
  case SProp.CIMType of
    wbemCimtypeSint8, wbemCimtypeUint8, wbemCimtypeSint16, wbemCimtypeUint16,
    wbemCimtypeSint32, wbemCimtypeUint32, wbemCimtypeSint64:
      sValue := IntToStr(SProp.Get_Value);
    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
            sValue := sValue + ' ' + SProp.Get_Value[Count];
      end
    else
      sValue := SProp.Get_Value;
    wbemCimtypeDatetime:sValue:=SProp.Get_Value//DateTimeToStr(SProp.Get_Value)
  else
      Exception.Create('Unknown type');
  end; {case}
  result:=sValue;
end;

procedure getAdapters(owner:TComponent; RemoteMachine,RemoteUser,RemotePassword:string; Adapters:TStrings);
var
  Locator: TSWbemLocator;
  SinkClasses: TSWbemSink;

  Services:  ISWbemServices;
  ObjectSet: ISWbemObjectSet;
  SObject:   ISWbemObject;
  propSet :  ISWbemPropertySet;
  SProp:     ISWbemProperty;
  Enum:      IEnumVariant;
  tempObj:   OleVariant;
  Value:     Cardinal;

  sValue,
  className:    String;
  strQuery:  WideString;
begin
  className:='WIN32_NetworkAdapter';
  clear(adapters);
  Locator:=TSWbemLocator.Create(owner);
  SinkClasses:=TSWbemSink.Create(owner);

  try
    SinkClasses.Cancel;

    if RemoteMachine='' then
      RemoteMachine:='.';// local machine
    Services := Locator.ConnectServer(RemoteMachine, 'root\CIMV2', RemoteUser, RemotePassword, '',
      '', 0, nil);

    ObjectSet := Services.InstancesOf(className, wbemFlagReturnImmediately or wbemQueryFlagShallow, nil);

    Enum := (ObjectSet._NewEnum) as IEnumVariant;
    while (Enum.Next(1, tempObj, Value) = S_OK) do
    begin
      SObject := IUnknown(tempObj) as SWBemObject;
      propSet := SObject.Properties_;
      SProp:=propSet.Item('NetConnectionID',0);// caption or systemname
      // now get the value of the property
      sValue:=getPropValue(SProp);
      if sValue<>'<empty>' then
      begin
        sProp:=propSet.Item('NetConnectionStatus',0);
        Adapters.AddObject(sValue,TIWrapper.Create(SProp));
      end;
    end; {while Enum}

    strQuery := 'SELECT * FROM __InstanceCreationEvent within 5 WHERE TargetInstance' +
      ' ISA "'+className+'"';
    Services.ExecNotificationQueryAsync(SinkClasses.DefaultInterface, strQuery, 'WQL', 0, nil, nil);
      strQuery := 'SELECT * FROM __InstanceDeletionEvent within 5 WHERE TargetInstance' +
      ' ISA "'+className+'"';
    Services.ExecNotificationQueryAsync(SinkClasses.DefaultInterface, strQuery, 'WQL', 0, nil, nil);
  finally
  end; {try}
  Locator.Free;
  SinkClasses.Free;
  Services:=nil;// make sure the references are decreased
  ObjectSet:=nil;
  SObject:=nil;
  enum:=nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  statusbar1.simpletext:='querying WMI....';
  getAdapters(self, '', '', '', listbox1.items);
  statusbar1.simpletext:='done';
end;

{ TIWrapper }

procedure TForm1.FormDestroy(Sender: TObject);
begin
  clear(ListBox1.Items);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  if ListBox1.ItemIndex=-1 then
    exit;
  with ListBox1.Items.Objects[ListBox1.ItemIndex] as TIWrapper do
    CheckBox1.checked:=getpropvalue(prop)='2';
end;

end.

msickel 31. Jul 2010 22:35

AW: TSWbemLocator not found
 
Hat sich erledigt habe eine WbemScripting_TLB bei Koders Code Search geladen, mit der hat es funktioniert.

mfg
Martin


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz