Serial port enumeration in Delphi using SetupDiGetClassDevs

前端 未结 5 781
情书的邮戳
情书的邮戳 2021-01-01 04:32

I\'m trying to enumerate \"friendly names\" for COM ports. The ports may dynamically change as USB-serial devices are connected and disconnected at runtime.

Based on

5条回答
  •  情歌与酒
    2021-01-01 04:51

    The following procedure is working correctly for me (in Windows 8.1). It is important to use the parameter KEY_READ in the TRegistry.Constructor.

    procedure  EnumComPorts(const   Ports:  TStringList);
    
    var
      nInd:  Integer;
    
    begin  { EnumComPorts }
      with  TRegistry.Create(KEY_READ)  do
        try
          RootKey := HKEY_LOCAL_MACHINE;
          if  OpenKey('hardware\devicemap\serialcomm', False)  then
            try
              Ports.BeginUpdate();
              try
                GetValueNames(Ports);
                for  nInd := Ports.Count - 1  downto  0  do
                  Ports.Strings[nInd] := ReadString(Ports.Strings[nInd]);
                Ports.Sort()
              finally
                Ports.EndUpdate()
              end { try-finally }
            finally
              CloseKey()
            end { try-finally }
          else
            Ports.Clear()
        finally
          Free()
        end { try-finally }
    end { EnumComPorts };
    

提交回复
热议问题