Kann man die 'Frinedly names' der COM-Ports auslesen ?

18/04/2009 - 16:56 von Nicolas Nickisch | Report spam
Ist es möglich die Klartextnamen der COM-Ports auszulesen ?

Ich habe mit viel Mühe einem USB2seriell-Treiber einen griffigen Namen
beigebracht.
Jetzt taucht auch brav im Geràte-Manager das Geràt mit Namen und in Klammern
der COM-Port auf.

In meinem VB.NET-Programm lese ich nun mit
System.IO.Ports.SerialPort.GetNames() die Namen aus.
Leider kommen nur die nackten COM-Ports, nicht aber die Klartextnamen.

Meine Recherchen habe nichts konkretes ergeben. Kann jemand helfen ?

Gruss Nico
 

Lesen sie die antworten

#1 Thorsten Doerfler
19/04/2009 - 11:11 | Warnen spam
Nicolas Nickisch schrieb:
Ist es möglich die Klartextnamen der COM-Ports auszulesen ?



Ja.

Jetzt 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/lib...94413.aspx

MSDN Win32_PnPEntity Class
http://msdn.microsoft.com/en-us/lib...94353.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/

Ähnliche fragen