2008年7月11日

シリアルポートの列挙

PC上で使用できるシリアルポートはレジストリの"HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM"上の"COM"で始まるエントリを列挙すればよい。ただしこのエントリはOpenKeyReadOnlyで開かないとユーザ権限によってはエラーになるので要注意。
uses
  Windows, SysUtils, Classes, Registry;

function EnumSerialComm(const S: TStrings): Integer;
var
  Index: Integer;
  PortNo: Integer;
  Str: String;
  Names: TStringList;
begin

  Result := 0;

  S.Clear;

  { Create temporary string list object }
  Names := TStringList.Create;
  try
    { Create and open registry key }
    with TRegistry.Create do
    begin
      try
        RootKey := HKEY_LOCAL_MACHINE;
        OpenKeyReadOnly('\HARDWARE\DEVICEMAP\SERIALCOMM');
        try
          { Get names }
          GetValueNames(Names);

          { Read key values }
          for Index := 0 to Names.Count - 1 do
          begin
            if GetDataType(Names.Strings[Index]) = rdString then
            begin
              Str := ReadString(Names.Strings[Index]);
              if CompareText(Copy(Str,1,3),'COM') = 0 then
              begin
                PortNo := StrToIntDef(Copy(Str,4,Length(Str)),-1);
                if PortNo > 0 then
                begin
                  S.AddObject(Str,Pointer(PortNo));
                  if Result < PortNo then
                  begin
                    Result := PortNo;
                  end;
                end;
              end;
            end;
          end;

        finally
          { Close registry key }
          CloseKey;
        end;

      finally
        Free;
      end;
    end;

  finally
    { Release local objects }
    Names.Free;
  end;

end;

取り込んだシリアルポートはソートされていない(レジストリのエントリ順)なので、必要に応じてソートしてから使用しましょう。

0 件のコメント: