Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Wmi benutzen mit FreeBasic

von RedakteurytwinkySeite 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..).

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  6  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 19.02.2011 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 19.02.2011 von Redakteurytwinky gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen