Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   WMI (Windows Management Instrumentation) + Demo (https://www.delphipraxis.net/74665-wmi-windows-management-instrumentation-demo.html)

himitsu 7. Aug 2006 12:20


WMI (Windows Management Instrumentation) + Demo
 
Liste der Anhänge anzeigen (Anzahl: 3)
Es ist soweit, hier mal das erste, größere Bestandteilchen aus meinem kleiner ProgrammCheck (Festplatten auslesen).

Und zwar die Unit für das WMI (Windows Management Instrumentation).

Als Vorlage hatte ich vorwiegend das magwmi von Angus Robertson, Magenta Systems Ltd, England, welches auch mit beiliegt. (MAGWMI50 > TESTWMI1.EXE)


Dat WMIDemo is von mir.


[add]
ach ja, ich hab vorallem ausgemistet.

Dat Original war mir irgendwie so groß, unübersichtlich und vorallem is dat SMART aus dem WMI raus ...

erstens hatte ich ja schon was für's S.M.A.R.T (hier aus'm Forum) und dann is es eh blöd, wenn sich in 'ner WMI-Demo was anderes Nicht-WMI-mäßiges versteckt, welches es nicht gerade übersichtlicher macht. ;)


[edit]
Räschtschreibfehler, Satzbau, Douwnloads nachgeladen ...

Go2EITS 7. Aug 2006 13:08

Re: WMI (Windows Management Instrumentation) + Demo
 
Hallo, himitsu

Was macht Dein Programm? Ich kann mir nix darunter vorstellen.
Screenshoots sind hier fast obligatorisch.
Exe mit UPX oder 7zip packen. Entlastet Server und meine ISDN Leitung... :thumb:

[Nachtrag: Danke für die Infos!]

Grüße
Go2EITS

himitsu 7. Aug 2006 13:20

Re: WMI (Windows Management Instrumentation) + Demo
 
Bildchen bringen hier wohl eh nicht viel.

Im Grunde greift es "nur" auf das WMI zu und ließt die vorhandenen Daten aus.


Das WMI besteht vorwiegend aus netten Klassen, worüber man Zugriff auf verschiedenste Systemfunktionen bekommt.


Vorwiegend und am einfachsten kann man halt auslesen, da alle Klassen über die gleichen grundlegenden Schnittstellen verfügen,
aber wie man sehen kann, kann man auch "senden" (also den PC steuern).

In meiner Demo sind nahezu alle vorhandenen Standardklassen aufgelistet.

Also einfach mal die Query-ComboBox öffnen,
was aussuchen,
Enter (oder den QueryButton) drücken,
und gucken was ankommt.


Nur bei der Runterfahrendemo würde ich aufpassen, also vorher besser speichern. :angel2:



Ach ja, einiges könnte ohne Adminrechte nicht laufen ... ist halt immer so, bei systemnahen Dingen ^^


[edit]
hier mal ein Beispiel für soeine Klasse:
MSDN-Library durchsuchenWin32_OperatingSystem (erster Link im Suchergebnis)

dat is och die, welche in meiner Demo gleich als Erste zur Auswahl steht.

Also meine Demo nur starten, Enter drücken und sich im MSDN angucken, was dazu geschrieben steht. :zwinker:

Hybrid666 26. Jun 2007 23:33

Re: WMI (Windows Management Instrumentation) + Demo
 
Ist deine WMI.pas Opensource? hast du sie selbst geschrieben? wenn nein, wer ist der autor...würde es gerne für ein projekt verwenden....

MfG Hybrid

Phoenix 27. Jun 2007 08:47

Re: WMI (Windows Management Instrumentation) + Demo
 
Zitat:

Zitat von Hybrid666
würde es gerne für ein projekt verwenden....

Würdest du nicht *g*

Die WMI.pas ist sehr, sehr, sehr buggy.
Spätestens wenn man sich in der WMI-Struktur dynamisch durchhangeln möchte handelt man sich damit abartige Speicherlecks ein, da die wirklich extrem unsauber arbeitet.

Alter Mann 27. Jun 2007 17:06

Re: WMI (Windows Management Instrumentation) + Demo
 
Schließe mich meinem 'vorschreiber' Phoenix an.

@Hybrid666
Wenn Du wissen willst wie WMI funktioniert dann lese dies:WMI.

himitsu 19. Jun 2009 13:35

Re: WMI (Windows Management Instrumentation) + Demo
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es hat zwar gedauert, aber ich konnte nun an 4 Stellen ein Speicherleck bei den COM-Variants entdecken
und der "Fehler" liegt in IEnumVariant.Next, welches einen eventuell vorhandenen Variant im Parameter rgVar einfach so überschreibt und die enthaltenen Daten nicht freigibt. :shock:

Code:
STDMETHODIMP
CEnumVariant::Next(ULONG cElements, VARIANT FAR* pvar, ULONG FAR* pcElementFetched)
{
   HRESULT hr;
   ULONG l;
   long l1;
   ULONG l2;

   if (pcElementFetched != NULL)
      *pcElementFetched = 0;

   if (pvar == NULL)
      return E_INVALIDARG;

   for (l=0; l<cElements; l++)
      [color=#ff0000]VariantInit(&pvar[l]);[/color]
also liegt die Ursache direkt in de Eingeweiden von MS und selbst im MSDN konnt ich noch keinen Hinweis auf dieses Verhalten finden (wurde nur zufällig auf die Sourcen der Funktion aufmerksam gemacht)
[edit]
nach etwas rumklicken hab ich doch noch was gefunden
Zitat:

Diese Methode gibt einen Verweis auf die aufgelisteten Elemente zurück. Dieser Parameter wird nicht initialisiert übergeben.
ist aber auch sehr leicht zu übersehen :wall:
PS: in der Delphi-OH steht dieser Hinweis nicht drin.
[/edit]



Hab also mal ein paar VarClear "vor" dem Aufruf dieser Funktion eingebaut und scheinbar gibt es nun keinen "unnormalen" Anstieg des RAM-Verbrauchs mehr.

Zusäzlich hab ich mir gleich mal erlaubt die Exceptions zu überarbeiten (hab da in der Zwischenzeit etwas dazugelernt :nerd: )

Nja, falls das nun alle Speicherlöscher waren, müßt ich dann mal irgendwann die eingefügten Befehler etwas aufräumen und besser verteilen (wurde eben etwas größzüg damit umgegangen :oops: )


[add2]
ist schon inteessant, wie man mit etwas anderem/neuerem Wissen dann doch noch endlich mal ein schon einige Jahre altes Problem lösen kann (hoff ich mal)

nanix 11. Jan 2010 18:43

Re: WMI (Windows Management Instrumentation) + Demo
 
There is a bug SetLength(_WMIResults.Instance, WMIObjectSet.Count); line 595

when i use it with my code

Delphi-Quellcode:
unit Unit6;

interface

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

 const
   Days : array[0..37] of string =
   (
     'Processor',
     'BIOS',
     'SystemSlot',
     'Bus',
     'SystemEnclosure',
     // Motherboard
     'BaseBoard',
     'MotherboardDevice',

     'DMAChannel',
     // Controler
     '1394Controller',
     'IDEController',
     'FloppyController',
     'PCMCIAController',
     'USBController',



     // Drives
     'CDROMDrive',
     'DiskDrive',
     'TapeDrive',

     // Network
     'NetworkAdapter',
     'NetworkAdapterConfiguration',

      // Printer
     'Printer',
     'PrinterConfiguration',


      // Device
      'OnBoardDevice',
      'InfraredDevice',
      'PointingDevice',
      'SoundDevice',
{IRQResource
Keyboard


    PrintJob



ParallelPort


PnPEntity

PortableBattery
PortConnector
PortResource
POTSModem
PowerManagementEvent


Refrigeration
SerialPort
SerialPortConfiguration


SystemEnclosure

SystemSlot   }






     // Memory
     'MemoryArray',
     'MemoryDevice',
     'PhysicalMemory',
     'PhysicalMemory',
     'SMBIOSMemory',
     'PhysicalMemoryArray',
     'SystemMemoryResource',
     'CacheMemory',

     // Graphics
     'DesktopMonitor',
     'DisplayControllerConfiguration',
     'DisplayConfiguration',
     'VideoController',
     'VideoConfiguration',
     'VideoSettings'
     ) ;

type
  TForm6 = class(TForm)
    TreeView1: TTreeView;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  type
  propertys=record
    index:integer;
    name:string;
    Value:String;
  end;

  type
  instance=record
    Index:Integer;
    name:string;
    Propertys: array of Propertys;

  end;

 type
 WMIClass= record
  index:integer;
  name:string;
  Instances:array of instance;
 end;



var
  Form6: TForm6;
  wmi_class:array of WMIClass;
implementation

{$R *.dfm}
 function GetNodeByText
(ATree : TTreeView; AValue:String;
 AVisible: Boolean): TTreeNode;
var
    Node: TTreeNode;
begin
  Result := nil;
  if ATree.Items.Count = 0 then Exit;
  Node := ATree.Items[0];
  while Node <> nil do
  begin
    if UpperCase(Node.Text) = UpperCase(AValue) then
    begin
      Result := Node;
      if AVisible then
        Result.MakeVisible;
      Break;
    end;
    Node := Node.GetNext;
  end;
end;



end;

end;

procedure TForm6.FormCreate(Sender: TObject);
var
i,j:integer;
WMIResults: TWMIInfo;

_Days: Integer;
_Instance:Integer;
_Propertys:Integer;

propertycount:integer;
dayscount:integer;
instancecount:integer;

begin




SetLength(Wmi_class,Length(Days));
for _Days:=0  to Length(Days)-1  do begin

if not WMIGetInfo('.','', '','', 'Win32_'+Days[_Days], WMIResults) then begin
showmessage('error');
Continue;
end;


If WMIResults.Instance = nil Then begin
 wmi_class[_Days].name:=Days[_Days]+' Not Supported';
Continue;
end;


for _Instance := 0 to Length(WMIResults.Instance)-1 do

for _Propertys := 0 to Length(WMIResults.PropName)-1 do begin

dayscount:=Length(Days);
instancecount:=Length(WMIResults.Instance);
propertycount:=Length(WMIResults.PropName);

SetLength(wmi_class[_Days].Instances,instancecount);
SetLength(wmi_class[_Days].Instances[_Instance].Propertys,propertycount);



          wmi_class[_Days].name:=Days[_Days];
          wmi_class[_Days].Instances[_Instance].Name:='Instance '+inttostr(_Instance);
          wmi_class[_Days].Instances[_Instance].Index:=_Instance;
          wmi_class[_Days].Instances[_Instance].Propertys[_Propertys].index:=_Propertys;
          wmi_class[_Days].Instances[_Instance].Propertys[_Propertys].name:=WMIResults.PropName[_Propertys];
          wmi_class[_Days].Instances[_Instance].Propertys[_Propertys].Value:=WMIRead(WMIResults, _Instance, _Propertys);


end;




end;




end;

end.

Gruber_Hans_12345 21. Okt 2016 15:59

AW: WMI (Windows Management Instrumentation) + Demo
 
Gibt es für die WMI.pas ein einfaches Beispiel wie man die verwenden kann?

t.roller 21. Okt 2016 16:09

AW: WMI (Windows Management Instrumentation) + Demo
 
Liste der Anhänge anzeigen (Anzahl: 2)
WMI DELPHI CODE CREATOR
WDCC.exe im Anhang


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 Uhr.
Seite 1 von 2  1 2      

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