Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [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!

Code-Beispiel

Code-Beispiele » System

Enumerate Ports

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.Redakteurytwinky 16.04.2012

Zippy hat im englischen Forum einen sehr interessanten Code zur Ermittlung von Geräten geschrieben(s. Linkadresse im Quelltext).
Den habe ich mir mal vorgenommen und 'eingedeutscht', aber diesmal nicht mit meiner bekannten Umlaut-Zeile im Header..
Damit entfällt die Verwendung 'kryptischer' Zeichen im Quellcode.
So könnten z.B. COM-Ports mit der Anweisung:

EnumPorts -n | Find "COM"

angezeigt werden.
Ich habe für die Ausgabe eine Funktion eingefügt, mit der jeder String vor der Ausgabe umgewandelt werden kann.
Da nun aber ein Konsolenfenster bei mir 132 Spalten x 50 Zeilen groß ist, habe ich die Ausgabe etwas geändert..

'Originalauthor:Zippy
'http://www.freebasic.net/forum/viewtopic.php?f=6&t=10615
'2nd code
'"Translation" and modification for german-output: ytwinky, MD
#define KB 1024
    'enumerate devices?, Windows only, WINNT forward
    #include once "windows.bi"
    #include once "win\setupapi.bi"
    '
Function Char2Oem(What As String) As String 'needed only on non-english systems
'a function to preserve the functionality of Print..
    Dim Char As zString Ptr    'declare two zstring-ptrs which can be used by OemToChar()
    Dim Oem As zString Ptr
    Var el=Len(What)+1         'the default-type of el is evaluated by var:(obviously) Integer in this case
    Char=Allocate(el)          'allocate space, if you want to crash your system remove +1 *rofl*
    Oem=cAllocate(el)          'allocate space, if you want to crash your system remove +1 *rofl*
        *Char=What               'Set Char=What
    CharToOem(Char, Oem)     'now change it..
    What=*Oem                'now assign the contents of Oem to What
    DeAllocate Oem             'to avoid memory leaks deallocate the variables
    Oem=0                      'set Oem to 0, to avoid access to the deallocated memory
    DeAllocate Char            'reverse order only because it was important in Turbo-Pascal ;-))
    Char=0                     'set Char to 0, to avoid access to the deallocated memory
    Return What                'now return the changed string..
End Function                 'well, done ;-))

    dim as HDEVINFO hDevInfo
    dim as SP_DEVINFO_DATA DeviceInfoData
    dim as integer buffersize, LineCounter=0, DataT, i, NoW8=False
    dim as string buffer, k=space(KB), s
Select Case lcase(Command(1))
    Case "/h", "-h", "/?", "-?", "--hilfe", "--help"
        s = !"Enumerate Devices von Zippy\nFür deutsche Ausgabe angepaßt und ergänzt von ytwinky\nAufruf:\n"
        s &=!"EnumPorts [[/|-]?|[/|-]n]\nWobei:\n /? nur EINE Möglichkeit ist, diese Hilfe angezeigt zu bekommen..\n"
        s &=!" /n nicht bei jeder vollen Seite auf drücken von Enter wartet\n"
        Print Char2Oem(s &"    (sinnvoll für das Filtern der Ausgabe..)")
        End
    Case "/n", "-n"
        NoW8=True
End Select
    '
    hDevInfo=SetupDiGetClassDevs(NULL, 0, 0, DIGCF_PRESENT Or DIGCF_ALLCLASSES)
    '
    if hDevInfo=INVALID_HANDLE_VALUE then
        print "SetupDiGet schiefgegangen, Ende bei Tastendruck.."
        sleep
        End 27
    end if
    '
    DeviceInfoData.cbSize=sizeof(SP_DEVINFO_DATA)
    SetupDiEnumDeviceInfo(hDevInfo, i, @DeviceInfoData)
    for i=1 to 25000
    '
        SetLastError(0)
        SetupDiEnumDeviceInfo(hDevInfo,i,@DeviceInfoData)
            if GetLastError()=ERROR_NO_MORE_ITEMS then exit for
        '
        buffersize=KB
        buffer=k
        '
        SetupDiGetDeviceRegistryProperty(_
            hDevInfo,_
            @DeviceInfoData,_
            SPDRP_DEVICEDESC,_'SPDRP_FRIENDLYNAME,_
            @DataT,_
            strptr(buffer),_
            buffersize,_
            @buffersize)
            '
        buffer=trim(buffer)
        if buffer>"" then
            '
            s=buffer &"  "
            LineCounter+=1
            '
            buffersize=KB
            buffer=k
            '
            SetupDiGetDeviceRegistryProperty(_
                hDevInfo,_
                @DeviceInfoData,_
                SPDRP_FRIENDLYNAME,_ 'SPDRP_DEVICEDESC
                @DataT,_
                strptr(buffer),_
                buffersize,_
                @buffersize)
            '
            buffer=trim(buffer)
            if buffer>"" then
                s &=buffer &" "
            else
                s &=Space(LoWord(Width)-Len(s)-2) &"*"
            end if
            If LoWord(Width)<Len(s) Then LineCounter += 1
              Print Char2Oem(s)
              If NoW8 Then Continue For
            if LineCounter=HiWord(Width)-1 Then
                LineCounter=0
                Print "::::Pause::::                          Weiter mit Enter";
                s=""
                Do
                    s=InKey
                    Sleep 1
                Loop Until s=!"\r"
                Print s;
            EndIf
        end if
    '
    next i
    '
    print "Erledigt, Ende mit beliebiger Taste..";
    If NoW8=False Then GetKey 'beware: NOT will not deliver the desired results..
    Print !"\r***EnumPorts-Ende***" &Space(40);
    end


Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 16.04.2012 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 16.04.2012 von Redakteurytwinky gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen