Vorhandene COM-Ports auflisten



  • Hallo,
    ich suche eine Möglichkeit, die mir alle vorhandenen COM-Ports meines PCs ausgiebt. Am liebsten noch mit der jeweiligen Bezeichnung des Ports.

    Hat jemand eine Idee/Code???

    Gruß
    Torsten



  • vielleicht hilft dieser Link weiter: http://www.naughter.com/enumser.html



  • diese Seite hatte ich auch schon gefunden. Da konnte ich mir auch einige Source-Dateien herunterladen. Doch wenn ich diese in ein Projekt einbinde, bekomme ich eine Menge Fehlermeldungen nach dem Motto: kenne ich nicht, nicht vorhanden, nicht eingebunden, etc...

    Gibt es denn noch eine weitere Möglichkeit???

    Gruß
    Torsten



  • Liegt vielleicht daran, dass das Projekt MFC-Klassen verwenden will, die du im Builder vermutlich nicht hast. Du kannst ja mal versuchen, CENUMERATESERIAL_USE_STL zu definieren (siehe Changelog unten auf der Seite).





  • Ich habe die SF doch genutzt 🙄 nur bringen die Ergebnisse der angesprochenen Lösungen nicht das Ergebnis, das ich gern hätte. Es wird lediglich nur die zur Verfügung stehenden COM-Ports gelistet (COM1, COM2, etc.) bzw. (von der Support-Seite von MS) sämtliche Hardware-Bauteile meines PCs. Ich hätte gern die Bezeichnung der COM-Geräte (Kommunikationsanschl. (COM1); ECP-Druckeranschluss (LPT1) etc.).

    Gruß
    Torsten



  • Da wirst du wohl WMI benutzen müssen. Bei den gesuchten Werten dürfe es sich um root\CIMV2\Win32_SerialPort\Caption bzw. ...\Win32_ParallelPort\Caption handeln.
    Zum Glück existiert ein Tool, das hierfür fertigen Sourcecode erzeugen kann und auch sonst das Thema WMI verständlicher macht: http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/

    Alternativ böte sich eventuell auch das Auslesen der Registry unter HKLM\System\CurrentControlSet an (mal die regedit-Suchfunktion benutzen). Ich glaube aber, dass sich das u.a. wegen internationaler Sprachen und abweichender Rechnerarchitekturen (z.B. ACPI vs. APM) bei weitem nicht so universell einsetzen lässt wie der WMI-Ansatz.



  • Hallo Jansen,

    Jansen schrieb:

    ...Bei den gesuchten Werten dürfe es sich um root\CIMV2\Win32_SerialPort\Caption bzw. ...\Win32_ParallelPort\Caption handeln.
    Zum Glück existiert ein Tool, das hierfür fertigen Sourcecode erzeugen kann und auch sonst das Thema WMI verständlicher macht: http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/

    Dieses Tool habe ich mal genutzt und unter dem Schlüssel "root\CIMV2\Win32_SerialPort\Caption" findet er lediglich einen Eintrag:

    Kommunikationsanschluss (COM1)

    Das ist ja auch korrekt so. In meinem System gibt es aber auch den "USB Serial Port (COM15)". Und genau diesen möchte ich aufgelistet bekommen. In dem Tool habe ich bis jetzt noch keinen Namespace/Classes gefunden, das mir diesen Eintrag auflistet 😞

    Kannst Du mir da weiter helfen???

    Gruß
    Torsten



  • Der Tipp von Linnea mit http://www.naughter.com/enumser.html ist wirklich Gold wert!

    Versuch mal die 9 verschiedenen Methoden herauszupicken und betrachte jede Methode für sich alleine.
    Und baue den Source in Dein Delphi-Code ein.

    Siehe auch mein Beitrag in:

    RS232 / COM-Port Identifikation
    http://www.c-plusplus.net/forum/283544

    HTH,
    Martin



  • Hallo,

    in der Registry. Unter *HKLM\HARDWARE\DEVICEMAP\SERIALCOMM* kannst du alle COM-Ports, die im Geraete-Manager aufgelistet sind, aufzahlen. Und dann mit CreateFile(...) drauf zugreifen.

    hier ein kleiner Beispiel von mir:

    http://pics.kz/i1/74/82/7482685079c0c09f4739639fe80f7314.jpg

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <Registry.hpp>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	TRegistry	*pReg	=	new TRegistry(KEY_READ);
    	pReg->RootKey		=	HKEY_LOCAL_MACHINE;
    	TStringList	*pList	=	new TStringList();
    
    	ListView1->Items->Clear();
    
    	pReg->OpenKey("\\HARDWARE\\DEVICEMAP\\SERIALCOMM\\",false);
    	pReg->GetValueNames(pList);
    
    	for(int i = 0; i < pList->Count; i++)
    	{
    		TListItem	*pItem	=	ListView1->Items->Add();
    		pItem->Caption		=	String(i)+". ";
    		pItem->Caption	   +=	pList->Strings[i];
    		pItem->SubItems->Add(pReg->ReadString(pList->Strings[i]));
    	}
    }
    //---------------------------------------------------------------------------
    


  • ich habe mir mal eine Methode geschrieben:

    #include <Registry.hpp>
    
    void LoadCOM(TStrings* portliste)
    {
      TRegistry* registry = new TRegistry;
      registry->RootKey = HKEY_LOCAL_MACHINE;
      registry->OpenKey("HARDWARE\\DEVICEMAP\\SERIALCOMM\\", false);
      TStringList *keys = new TStringList();
      registry->GetValueNames(keys);
      portliste->Clear();
      for(int i=0; i<keys->Count; i++)
         portliste->Add(registry->ReadString(keys->Strings[i]));
      registry->CloseKey();
      delete registry;
      delete keys;
    }
    

    kann man dann einfach zB in eine Combobox laden:

    LoadCOM(cmbMeineComboBox->Items);
    

Anmelden zum Antworten