Tutorial
Wmi benutzen mit FreeBasic
von ytwinky | Seite 3 von 6 |
Zu jedem Alias läßt sich mit
WMIC aliasname Get /?
eine Liste der vorhandenen Element erstellen, damit wird die Bedienung ein 'Kinderspiel' XD
Beim Blick auf die Alias-Liste fällt uns direkt der Aufruf 'DiskDrive' auf und wir glauben uns bereits am Ziel, aber weit gefehlt, doch schauen wir uns das Ergebnis erstmal an:
(Ich habe hier beim Aufruf nicht wesentliche Teile weggelassen, sondern nur relevante genommen):
#include once "windows.bi" 'in
#define UNICODE 'this
#include once "disphelper/disphelper.bi" 'order
#include "vbcompat.bi"
Const MaxDim=5, Esc=!"\27"
Const strComputer="." 'oder "localhost" oder Environ("ComputerName")
Const impersonate="winmgmts:{impersonationLevel=impersonate}!\\" &strComputer &"\root\cimv2"
Const SelectClass="Select * from Win32_DiskDrive"
Dim As HRESULT hres
Dim As ZString Ptr devCaption, devIndex, devInterfaceType, devPartitions, devScsiPort, devScsiTargetID
DISPATCH_OBJ(wmiSvc)
DISPATCH_OBJ(colDisk)
dhInitialize(TRUE)
'So wird eingestellt, ob Fehler angezeigt werden sollen oder nicht:
'dhToggleExceptions(TRUE) 'bei Bedarf das 1. ' entfernen ;-))
Print "Index Anschl. Part. SP ST Caption"
hres=dhGetObject(impersonate, NULL, @wmiSvc)
hres=dhGetValue("%o", @colDisk, wmiSvc, ".ExecQuery(%s)", SelectClass)
FOR_EACH0(objDisk, colDisk, NULL)
hres=dhGetValue("%s", @devCaption, objDisk, ".Caption")
hres=dhGetValue("%s", @devIndex, objDisk, ".Index")
hres=dhGetValue("%s", @devInterfaceType, objDisk, ".InterfaceType")
hres=dhGetValue("%s", @devPartitions, objDisk, ".Partitions")
hres=dhGetValue("%s", @devSCSIPort, objDisk, ".SCSIPort")
hres=dhGetValue("%s", @devSCSITargetID, objDisk, ".SCSITargetID")
Print " " &*devIndex &" "; 'Laufwerks-Index
Print " " &*devInterfaceType &" "; 'Anschlußtyp
Print " " &*devPartitions &" "; 'Anzahl der Partitionen
Print " " &*devScsiPort &" "; 'IDE-Kanal=SCSIPort+1
Print " " &*devScsiTargetID &" "; 'Master=0, Slave=1
Print *devCaption 'Laufwerks-Beschreibung
NEXT_(objDisk)
SAFE_RELEASE(wmiSvc)
SAFE_RELEASE(colDisk)
dhUninitialize(TRUE)
Print "Eniki..";
GetKey
Ok, da fehlt aber noch EINIGES..
Es sind keine Laufwerksbuchstaben dabei, CD/DVD-Laufwerke fehlen und nicht zu vergessen: Diskettenlaufwerk(e).
(Für die Jüngeren unter uns:da kommen diese kleinen Plastik-Dinger rein mit der (damals enormen) Speicherkapazität von 1,39 MB)
Einwand von Schlaumeiern: Das waren doch 1,44MB oder nicht? Antwort: Schauwermal, wie der Kaiser sagt..
Eine 3,5"-Scheibe hat ein Fassungsvermögen von 1457664 Byte und 1 KB=1024 Byte, macht 1423,5 KB..
1MB=1024KB, daraus folgt: Eine 3,5"-Diskette fasst 1.3901.. MB. Soviel im Moment dazu..
Nun wäre es ja auch schön, wenn wir anhand der Liste erkennen könnten, welches Laufwerk Master und welches Slave ist(und an welchem IDE-Port). Bitte, kein Problem:Die WMI liefert auch diese Information, aber das ist nicht so einfach, denn sie ist hinter den Bezeichnungen SCSIPort und SCSITargetID versteckt. Das bedeutet jetzt aber nicht, daß auf einmal SCSI-Laufwerke im Rechner sind ;-)
Wobei SCSIPort+1=IDE-Kanal und SCSITargetID=0:Master, 1:Slave
Ok, und wo sind nun die CD/DVD-Laufwerke? Schauen wir doch in die Alias-Liste..
CDRom scheint hier das Gewünschte zu sein:
#include once "windows.bi" 'in
#define UNICODE 'this
#include once "disphelper/disphelper.bi" 'order
#include "vbcompat.bi"
Const strComputer="." 'oder "localhost" oder Environ("ComputerName")
Const impersonate="winmgmts:{impersonationLevel=impersonate}!\\" &strComputer &"\root\cimv2"
Const SelectClass="Select * from Win32_CDRomDrive"
Dim As HRESULT hres
Dim As ZString Ptr devDeviceID, devScsiPort, devScsiTargetID
DISPATCH_OBJ(wmiSvc)
DISPATCH_OBJ(colDisk)
dhInitialize(True)
'So wird eingestellt, ob Fehler angezeigt werden sollen oder nicht:
'dhToggleExceptions(TRUE) 'bei Bedarf das 1. ' entfernen ;-))
Print "Index Anschl. SP ST DeviceID"
hres=dhGetObject(impersonate, NULL, @wmiSvc)
hres=dhGetValue("%o", @colDisk, wmiSvc, ".ExecQuery(%s)", SelectClass)
FOR_EACH0(objDisk, colDisk, NULL)
hres=dhGetValue("%s", @devDeviceID, objDisk, ".DeviceID")
hres=dhGetValue("%s", @devSCSIPort, objDisk, ".SCSIPort")
hres=dhGetValue("%s", @devSCSITargetID, objDisk, ".SCSITargetID")
Print Space(15) &*devScsiPort &" "; 'IDE-Kanal=SCSIPort+1
Print " " &*devScsiTargetID &" "; 'Master=0, Slave=1
Print *devDeviceID 'Laufwerks-Beschreibung
NEXT_(objDisk)
SAFE_RELEASE(wmiSvc)
SAFE_RELEASE(colDisk)
dhUninitialize(True)
Print "Eniki..";
GetKey
Ich habe hier absichtlich eine ähnliche 'Ausgabemaske' wie für DiskDrive gewählt, damit klar ersichtlich ist, daß weder Index noch Anschlußtyp hier zur Verfügung stehen. Doch da wir uns nicht 'Caption' sondern 'DeviceID' ausgeben lassen, können wir auch hier die richtigen Zuordnungen treffen:
Die ersten drei Buchstaben von DeviceID zeigen das an. Doch nicht nur das:
Nur wenn unter SCSIPort(SP) und SCSITargetID(ST) Zahlen stehen, ist das Gerät über IDE angeschlossen.
Festplatten können in mehrere Partitionen aufgeteilt sein(nein, das erkläre ich jetzt nicht weiter..).
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|