AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TSWbemLocator not found

Ein Thema von msickel · begonnen am 31. Jul 2010 · letzter Beitrag vom 31. Jul 2010
Antwort Antwort
msickel

Registriert seit: 14. Mai 2005
108 Beiträge
 
Delphi 2005 Professional
 
#1

TSWbemLocator not found

  Alt 31. Jul 2010, 18:33
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.
ich weiss, das ich nichts weiss!
  Mit Zitat antworten Zitat
msickel

Registriert seit: 14. Mai 2005
108 Beiträge
 
Delphi 2005 Professional
 
#2

AW: TSWbemLocator not found

  Alt 31. Jul 2010, 22:35
Hat sich erledigt habe eine WbemScripting_TLB bei Koders Code Search geladen, mit der hat es funktioniert.

mfg
Martin
ich weiss, das ich nichts weiss!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:26 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