Seite 1 von 2
Vorhandene COM Ports ermitteln?
Verfasst: 23.01.2009 10:47
von E-P-S
Hallo zusammen. Ich habe ein kniffliges Problem.
Ich möchte gerne alle vorhandenen COM Ports ( physisch und virtuell ) ermitteln.
An sich würde man einfach versuchen den Port zu öffnen und "mitschreiben" wo dies machbar ist und wo nicht. Entweder per API (CreateFile) oder per Lib ComOpen etc.
Das Problem: Wenn meine COM1 z.B. gerade von einem anderen Programm benutzt wird, dann bekomme ich beim Versuch sie zu öffnen einen Fehler und sie würde als "nicht vorhanden" eingestuft. Sie ist aber natürlich vorhanden - nur eben gerade nicht verfügbar.
Wie kann man denn noch die vorhandenen COM Ports ermitteln so das es von Windows 98 - Vista funktioniert?
Vielen Dank schonmal.
Verfasst: 23.01.2009 12:16
von Shardik
Hast Du schon probiert, ob sich der folgende Beispiel-Code aus dem englischen Forum von ABBKlaus für Deine Zwecke eignet?
http://www.purebasic.fr/english/viewtop ... 93&start=1
Bei mir läuft er unter WinXP SP2 problemlos. Laut VBArchiv (
http://www.vbarchiv.net/api/api_enumports.html) läuft die von ABBKLaus verwendete Funtion EnumPorts() auch unter Win95, Win98, WinME, WinNT 3.1 und Win2000...
Verfasst: 23.01.2009 13:25
von E-P-S
Jap, das hilft mir weiter - recht herzlichen Dank.
Verfasst: 26.01.2009 19:02
von HeX0R
Ich mache das immer so:
Code: Alles auswählen
;Get Available Com-Ports
Global NewList AvailableComs.l()
Procedure GetAvailableComPorts()
Protected hKey, lpcbName, lpName.s, a$, lType, i
If RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\SERIALCOMM", 0, #KEY_QUERY_VALUE , @hKey) = #ERROR_SUCCESS
lpName = Space(255)
ClearList(AvailableComs())
Repeat
lpcbName = 255
If RegEnumValue_(hKey, i, @lpName, @lpcbName, 0, 0, 0, 0) = #ERROR_SUCCESS
a$ = Left(lpName, lpcbName)
If a$ = ""
Break
EndIf
lpcbName = 255
lType = 0
If RegQueryValueEx_(hKey, a$, 0, @lType, @lpName, @lpcbName) = #ERROR_SUCCESS
a$ = Left(lpName, lpcbName - 1)
If LCase(Left(a$, 3)) = "com"
AddElement(AvailableComs())
AvailableComs() = Val(RemoveString(a$, "COM", 1))
EndIf
EndIf
i + 1
Else
Break
EndIf
ForEver
RegCloseKey_(hKey)
EndIf
EndProcedure
GetAvailableComPorts()
ForEach AvailableComs()
Debug AvailableComs()
Next
Verfasst: 26.01.2009 20:07
von E-P-S
Die Methode gefällt mir auch. Weist du mit Sicherheit bei welchen Betriebssystemen die funktioniert?
Verfasst: 26.01.2009 20:12
von ts-soft
E-P-S hat geschrieben:Die Methode gefällt mir auch. Weist du mit Sicherheit bei welchen Betriebssystemen die funktioniert?
Funktioniert zumindest unter XP und Vista (auch x64), erfordert aber
Admin-Rechte (unter XP meist vorhanden, unter Vista per default nicht)
Noch ältere Versionen kann ich leider nicht testen.
Verfasst: 26.01.2009 20:27
von HeX0R
ts-soft hat geschrieben:
Funktioniert zumindest unter XP und Vista (auch x64), erfordert aber
Admin-Rechte (unter XP meist vorhanden, unter Vista per default nicht)
Noch ältere Versionen kann ich leider nicht testen.
Ich kann das hier (Vista/User) nicht bestätigen (habs jetzt extra mal ausprobiert), hätte mich auch gewundert, die Keys werden ja nur
ausgelesen.
Es sollte ab Win9x funktionieren.
Verfasst: 26.01.2009 20:36
von ts-soft
HeX0R hat geschrieben:
Ich kann das hier (Vista/User) nicht bestätigen (habs jetzt extra mal ausprobiert), hätte mich auch gewundert, die Keys werden ja nur ausgelesen.
Ohne Adminrechte wird das Programm bei mir sofort beendet. Nur wenn ich
Adminrechte anfordere debugt er mir 1 (habe nur einen COM-Port)
Gruß
Thomas
Verfasst: 26.01.2009 20:40
von HeX0R
Du bist zu schnell, ich wollte gerade mein falsches Gelaber da oben revidieren
ts-soft hat mal wieder Recht.
Verfasst: 26.01.2009 20:45
von ts-soft
HeX0R hat geschrieben:Du bist zu schnell, ich wollte gerade mein falsches Gelaber da oben revidieren
ts-soft hat mal wieder Recht.
Hab gerade mal getestet, lesen geht ohne Admin-Rechte, Du hast Recht
aber: mit Deinem Snippet gehts nicht ohne
