![]() |
WMI (Windows Management Instrumentation) + Demo
Liste der Anhänge anzeigen (Anzahl: 3)
Es ist soweit, hier mal das erste, größere Bestandteilchen aus meinem
![]() Und zwar die Unit für das WMI (Windows Management Instrumentation). Als Vorlage hatte ich vorwiegend das magwmi von ![]() 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 ... |
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 |
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: ![]() ![]() 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: |
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 |
Re: WMI (Windows Management Instrumentation) + Demo
Zitat:
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. |
Re: WMI (Windows Management Instrumentation) + Demo
Schließe mich meinem 'vorschreiber' Phoenix an.
@Hybrid666 Wenn Du wissen willst wie WMI funktioniert dann lese dies: ![]() |
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:
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)
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] [edit] nach etwas rumklicken hab ich doch noch was gefunden Zitat:
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) |
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. |
AW: WMI (Windows Management Instrumentation) + Demo
Gibt es für die WMI.pas ein einfaches Beispiel wie man die verwenden kann?
|
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 12:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz