Post by Nicolas NickischIst es möglich die Klartextnamen der COM-Ports auszulesen ?
Ja.
Post by Nicolas NickischJetzt taucht auch brav im Geräte-Manager das Gerät mit Namen und in Klammern
der COM-Port auf.
Die Klartext Bezeichnungen der Schnittstellen kannst Du zum Beispiel
über WMI abfragen. Unter .NET im System.Management Namespace verpackt.
Unter WMI gibt es beispielsweise die Win32_SerialPort Klasse, die
eigentlich schon alle Informationen liefern würde. Allerdings gibt sie
bei mir nur den einzigen physikalischen COM Port zurück, die virtuellen
lässt sie außen vor.
Weit unschärfer ist die Win32_PnPEntity Klasse. Diese liefert
Informationen zu allen installierten Geräten zurück, erlaubt aber keinen
direkten Rückschluss zum COM Port. Die Geräteklasse kann man schon
einmal einschränken, so dass man nur noch Anschlüsse zurückbekommt.
Diese sind in der Geräteklasse {4D36E978-E325-11CE-BFC1-08002BE10318}
zusammengefasst. Darunter sind aber auch Druckeranschlüsse (LPT). Um auf
den COM Port zu schließen, gehen wir doch einfach mal davon aus, dass
dieser immer in Klammern am Ende des Klartextnamens angegeben ist. Die
Port-Namen kommen also weiterhin von SerialPort.GetPortNames() und
dienen zum Abgleich von Port zu Klartext Bezeichnung:
' ---
' Verweis auf System.Management hinzufügen!
' ---
Imports System.Management
Public Class Form1
Public Function SerialFriendlyNames() As Dictionary(Of String, String)
Dim lManObjects As ManagementObjectCollection
Dim lManSearcher As ManagementObjectSearcher
Dim lPorts() As String
Dim lNames As New Dictionary(Of String, String)
lPorts = IO.Ports.SerialPort.GetPortNames()
lManSearcher = New ManagementObjectSearcher( _
"Select * from Win32_PnPEntity " & _
"Where ClassGuid='{4D36E978-E325-11CE-BFC1-08002BE10318}'")
lManObjects = lManSearcher.Get
For Each lManObject As ManagementObject In lManObjects
Dim lName As String = CStr(lManObject("Name"))
For Each lPort As String In lPorts
If lName.EndsWith(String.Format("({0})", lPort)) Then
lNames.Add(lPort, lName)
End If
Next
Next
Return lNames
End Function
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.Load
Dim lListView As New ListView
lListView.Columns.Add("Port")
lListView.Columns.Add("Friendly Name")
lListView.Dock = DockStyle.Fill
lListView.View = View.Details
lListView.Visible = True
Me.Controls.Add(lListView)
For Each lPort In SerialFriendlyNames()
lListView.Items.Add(lPort.Key).SubItems.Add(lPort.Value)
Next
lListView.Columns(1).AutoResize( _
ColumnHeaderAutoResizeStyle.ColumnContent)
End Sub
End Class
' ---
Getestet habe ich das unter Win XP SP3, sowie Win Vista x64 SP1.
MSDN Win32_SerialPort Class
http://msdn.microsoft.com/en-us/library/aa394413.aspx
MSDN Win32_PnPEntity Class
http://msdn.microsoft.com/en-us/library/aa394353.aspx
Ein anderer Weg wäre über die Registry. Die COM Ports sind aufgelistet
unter:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\serenum\Enum
Von dort wird auf die weiterführenden Einträge verwiesen, die unter:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum
angelegt sind.
Unter:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\ACPI\PNP0501\1
finde ich bei mir zum Beispiel den Eintrag für den physikalischen COM
Port. Im Wert FriendlyName den dazu passenden Bezeichner, wie er auch im
Gerätemanager angezeigt wird. Im Unterschlüssel DeviceParameters unter
PortName auch den passenden Anschluss.
Thorsten Dörfler
--
Microsoft MVP Visual Basic
vb-hellfire visual basic faq | vb-hellfire - einfach anders
http://vb-faq.de/ | http://www.vb-hellfire.de/