AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte WMI (Windows Management Instrumentation) + Demo

WMI (Windows Management Instrumentation) + Demo

Ein Thema von himitsu · begonnen am 7. Aug 2006 · letzter Beitrag vom 21. Okt 2016
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von himitsu
himitsu
Registriert seit: 11. Okt 2003
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 ...
Angehängte Dateien
Dateityp: exe testwmi1_883.exe (559,0 KB, 379x aufgerufen)
Dateityp: exe wmidemo_189.exe (547,5 KB, 572x aufgerufen)
Dateityp: zip wmidemo_sources_205.zip (83,4 KB, 596x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
 
Go2EITS

 
Delphi 7 Personal
 
#2
  Alt 7. Aug 2006, 13:08
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...

[Nachtrag: Danke für die Infos!]

Grüße
Go2EITS
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 10.3 Rio
 
#3
  Alt 7. Aug 2006, 13:20
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.



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.
  Mit Zitat antworten Zitat
Hybrid666

 
Delphi 7 Personal
 
#4
  Alt 26. Jun 2007, 23:33
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
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
 
#5
  Alt 27. Jun 2007, 08:47
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.
Sebastian P.R. Gingter
  Mit Zitat antworten Zitat
Alter Mann

 
Delphi 10.2 Tokyo Professional
 
#6
  Alt 27. Jun 2007, 17:06
Schließe mich meinem 'vorschreiber' Phoenix an.

@Hybrid666
Wenn Du wissen willst wie WMI funktioniert dann lese dies:WMI.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 10.3 Rio
 
#7
  Alt 19. Jun 2009, 13:35
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.

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
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 )

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 )


[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)
Angehängte Dateien
Dateityp: pas wmi_167.pas (39,1 KB, 118x aufgerufen)
  Mit Zitat antworten Zitat
nanix
 
#8
  Alt 11. Jan 2010, 18:43
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.
  Mit Zitat antworten Zitat
Gruber_Hans_12345

 
Delphi 2007 Professional
 
#9
  Alt 21. Okt 2016, 15:59
Gibt es für die WMI.pas ein einfaches Beispiel wie man die verwenden kann?
  Mit Zitat antworten Zitat
t.roller
 
#10
  Alt 21. Okt 2016, 16:09
WMI DELPHI CODE CREATOR
WDCC.exe im Anhang
Miniaturansicht angehängter Grafiken
wdcc.jpg  
Angehängte Dateien
Dateityp: zip WDCC.zip (2,47 MB, 33x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf