Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [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 2 von 6

Um nun eine Alias-Liste mit FB zu erzeugen, muß auf alle Fälle disphelper.bi mit eingebunden werden, da es sonst nicht funktioniert. Die Reihenfolge der #includes muß strikt eingehalten werden. Ohne weiter auf Einzelheiten einzugehen, nehmen wir einfach das folgende Programm:

#include once "windows.bi"               'in
#define UNICODE                          'this
#include once "disphelper/disphelper.bi" 'order
Type AliasRec
    As String FriendlyName,Target
End Type
Const SelectClass="Select FriendlyName,Target From Msft_CliAlias"
Var strComputer=Environ("ComputerName"), i=0
Var impersonate="winmgmts:{impersonationLevel=impersonate}!\\" &strComputer &"\root\cli"
Dim arrAlias() As AliasRec
Dim hres As HRESULT
Dim As ZString Ptr devF, devT
Declare Sub ShellSort(Array() As AliasRec, aLo As Integer, aHi As Integer, kleiner As Integer=0)
Select Case lcase(Command(1))
    Case "/?", "?h", "-?", "-h"
      Print Autor &!"Syntax:\nFBWMIAlias [ComputerName]|[/?]\nwobei  ComputerName ein(erreichbarer) Rechner ist"_
                           !"\n        /? nur EINE Möglichkeit ist, diese Hilfe aufzurufen.."
    Case Else
        If Command(1)<>"" Then
            strComputer=Command(1)
            If InStr(strComputer, "\\") Then strComputer=Mid(strComputer, 3)
        End If
End Select
s &= strComputer
DISPATCH_OBJ(WmiSvc)
DISPATCH_OBJ(Items)
dhInitialize(TRUE)
'So wird eingestellt, ob Fehler angezeigt werden sollen oder nicht:
'dhToggleExceptions(TRUE) 'bei Bedarf das 1. ' entfernen ;-))

hres=dhGetObject(impersonate, NULL, @WmiSvc)
hres=dhGetValue("%o", @Items, WmiSvc, ".ExecQuery(%s)", SelectClass)
FOR_EACH0(Item, Items, NULL)
  hres=dhGetValue("%s", @devF, Item, ".friendlyname")
  hres=dhGetValue("%s", @devT, Item, ".target")
  ReDim Preserve arrAlias(i)
  arrAlias(i).FriendlyName=*devF
  arrAlias(i).Target=*devT
    i+=1
NEXT_(Item)
SAFE_RELEASE(WmiSvc)
SAFE_RELEASE(Items)
dhUninitialize(TRUE)
i-=1
ShellSort(arrAlias(), 0, i)
Print "AliasName"; Tab(22); "WMI-Pfad"
For j As Integer=0 To i
    Print arrAlias(j).FriendlyName; Tab(22); arrAlias(j).Target
Next
Print "Eniki..";
GetKey
End

Sub ShellSort(Array() As AliasRec, aLo As Integer, aHi As Integer, kleiner As Integer=0)
    'nach SortDemo.Bas für QBasic 2.0, ist zwar langsamer als Quicksort
    '..aber immer noch schneller als BubbleSort ;-))
    Var i=0, li=0, sw=0, ig=0, ik=0, Abstand=Int((aHi-aLo+1)/2)
  'Setze den Vergleichsabstand auf die Hälfte der Elemente in Array()
  While Abstand>0           'Schleife bis Abstand=0 ist
    li=aHi-Abstand
    Do
      sw=aLo          'Erstma keinen Tausch annehmen
      For i=aLo To li 'Vergleiche Elemente und tausche die Unsortierten..
        ig=i          'i tauschen wäre wenig sinnvoll..
        ik=i+Abstand  'Berechnung nur EINMAL(pro Durchlauf) ausführen..
        If kleiner Then Swap ig, ik 'Wozu zwei Funktionen? Einfach Indizes tauschen..
        If Array(ig).FriendlyName>Array(ik).FriendlyName Then 'hier ändern bei UDTs
          Swap Array(ig), Array(ik) 'hier nicht mehr, Swap tauscht ja auch ganze Records ;-)
          sw=ig             'Schalter setzen
        End If
      Next
      li=sw-Abstand         'Sortiere beim nächsten Mal nur bis zum letzten Tausch
    Loop Until sw=aLo
    Abstand=Abstand\2  'Kein Tausch beim letzten Mal, also Abstand halbieren..
  Wend                 'FB hat den \-Operator, AutoIt nicht..^^
End Sub

Na bitte, klappt doch prima, oder?
Der Befehl 'Get' weist die WMI an, die angeforderten Elemente dem Programm für jeden Alias an das Programm zu übergeben. Es gibt noch andere Verben(z.B. 'Call'), aber 'Get' ist das Ungefährlichste, da hiermit nur Informationen gelesen werden und am System nichts geändert wird. Das dient zum Schutz des Systems und des Benutzers, aber auch zu Schutz des Autors, damit niemand sagen kann:
Ich habe das genauso gemacht, wie beschrieben, doch jetzt ist mein Windows im Eimer..
Nochmal zum Mitmeißeln: Ich lehne jegliche Verantwortung für Fehler oder Systemausfälle, die durch die Benutzung der Programme in diesem Tutorial entstehen könnten, ab!
Nun gut, aber verlieren wir das Ziel nicht aus den Augen(das passiert leicht bei WMI-Aufrufen, weil einfach zuviel möglich ist).

 

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