Discussion:
Kann man die 'Frinedly names' der COM-Ports auslesen ?
(zu alt für eine Antwort)
Nicolas Nickisch
2009-04-18 14:56:26 UTC
Permalink
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
Thorsten Doerfler
2009-04-19 09:11:16 UTC
Permalink
Post by Nicolas Nickisch
Ist es möglich die Klartextnamen der COM-Ports auszulesen ?
Ja.
Post by Nicolas Nickisch
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/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/
Loading...