Code-Beispiel
Serielle Schnittstellen (COM-Ports) unter Windows ermitteln
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
k. A. | St_W | 09.04.2012 |
Unter Windows sind alle verfügbaren Seriellen Schnittstellen (COM-Ports) in der Registrierungsdatenbank unter dem Schlüssel "HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM" abgebildet. Dieser Registierungsschlüssel lässt sich auch ohne Administratorrechten auslesen und ist somit bestens dafür geeignet, die COM-Ports zu ermitteln.
Dazu wird der Schlüssel zuerst mittels RegOpenKeyEx geöffnet. Mittels RegQueryInfoKey kann die Anzahl der vorhanden Einträge sowie die maximale Länge des Schlüsselnamens (in Zeichen) und des Schlüsselwertes(in Bytes) ermittelt werden. Mit diesen Informationen kann mittels RegEnumValue über die einzelnen Einträge iteriert werden. Der Schlüsselname bezeichnet das Gerät, das den Port zur Verfügung stellt. Der Schlüsselwert bezeichnet den COM-Port selbst. Nachdem der Schlüssel ausgelesen wurde, muss dieser mittels RegCloseKey geschlossen werden.
'Vorhandene COM-Ports unter Windows ermitteln
'---
'Autor: Stefan Wurzinger am 09.04.2012
'Getestet mit FreeBASIC 0.23.0 unter Windows 7 (64-Bit)
#Include "windows.bi"
Dim hKey As HANDLE
Dim status As Integer
'Schlüssel öffnen; Fehlermeldung ausgeben und Programm beenden falls nicht erfolgreich
status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, @"HARDWARE\DEVICEMAP\SERIALCOMM", 0, KEY_QUERY_VALUE, @hKey)
If status <> ERROR_SUCCESS Then
Print "Fehler beim Öffnen des Registry Keys (Error"; status; ")"
Sleep
End
EndIf
Dim comCnt As Integer 'Anzahl der COM-Ports
Dim As String comStr, comPort 'Gerätename und COM-Port
Dim As Integer comStrLen, comPortLen 'Länge in Zeichen resp. Bytes
Dim As Integer comStrMaxLen, comPortMaxLen 'Maximale Länge in Zeichen resp. Bytes
'Größeninformationen des Schlüssels abfragen
RegQueryInfoKey(hKey, 0, 0, 0, 0, 0, 0, @comCnt, @comStrMaxLen, @comPortMaxLen, 0, 0)
comStr = String(comStrMaxLen, 0)
comPort = String(comPortMaxLen, 0)
For q As Integer = 0 To comCnt-1
comStrLen = comStrMaxLen+1 'Abschließendes NULL-Zeichen
comPortLen = comPortMaxLen/2 'ANSI anstatt UNICODE
'Schlüsselname und -wert ermitteln und ausgeben; Fehlermeldung ausgeben wenn nicht erfolgreich
status = RegEnumValue(hKey, q, StrPtr(comStr), @comStrLen,0 , 0, StrPtr(comPort), @comPortLen)
If status = ERROR_SUCCESS Then
Print Left(comPort, comPortLen) + Chr(9) + Left(comStr, comStrLen)
Else
Print "Fehler beim Auslesen des Registry Keys (Error"; status; " bei Index"; q; ")"
EndIf
Next
'Schlüssel schließen
RegCloseKey(hKey)
Print
Print comCnt; " COM-Ports vorhanden"
Sleep
Zusätzliche Informationen und Funktionen |
- Das Code-Beispiel wurde am 09.04.2012 von St_W angelegt.
- Die aktuellste Version wurde am 09.04.2012 von St_W gespeichert.
|
|