Entwickler-Ecke

Windows API - Alle ComPorts abfrage, aber wie?!


Glorfindel - Di 13.12.05 16:03
Titel: Alle ComPorts abfrage, aber wie?!
Tach Leute,

kann man unter Delphi 5 irgendwie die Anzahl/den Namen aller am Computer vorhandenen Comports erfragen?

Wenn da einer nee Lösung kennt, bitte melden.

Bis denn,

Glorfindel


chrisw - Di 13.12.05 16:14

such mal nach Suche in der Entwickler-Ecke ENUMCOMPORT


Glorfindel - Di 13.12.05 16:15

hab ich gemacht...kommt aber nix?


chrisw - Di 13.12.05 16:20

Sorry, hab ich doch schon mal gepostet.

Na, dann eben so : http://www.delphi-forum.de/viewtopic.php?p=215154


SchelmVomElm - Di 13.12.05 16:44

Variante 1 über Registry


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
procedure PortList(var Strings: TStrings);
var
  Reg : TRegistry;

  procedure ScanRegHardware;
  var
    i : integer;
    PortName : string;
    LName : TStringList;
  begin
    if Reg.OpenKeyReadOnly('\hardware\devicemap\serialcomm'then
    begin
      LName := TStringList.Create;
      Reg.GetValueNames(LName);
      for i := 0 to LName.Count - 1 do
      begin
        if Reg.GetDataType(LName.Strings[i]) = rdString then
        begin
          PortName := Reg.ReadString(LName.Strings[i]);
          if Strings.IndexOf(PortName) < 0 then Strings.Add(PortName);
        end;
      end;
      LName.Free;
    end;
  end;

  procedure ScanRegEnum(Key : String);
  var
    LKey : TStringList;
    LName : TStringList;
    i : Integer;
    Driver, PortName : String;
    PortSubClass : Byte;
  begin
    if not Reg.OpenKeyReadOnly(Key) then Exit;
    LName := TStringList.Create;
    Reg.GetValueNames(LName);
    i := LName.IndexOf('class');
    if i >= 0 then
    begin
      if (Reg.GetDataType('class') = rdString) and
         (LowerCase(Reg.ReadString('class')) = 'ports'and
         (Reg.GetDataType('driver') = rdString) and
         (Reg.GetDataType('portname') = rdString) then
      begin
        Driver := Reg.ReadString('driver');
        PortName := Reg.ReadString('portname');
        if(Reg.OpenKeyReadOnly('\System\CurrentControlSet\Services\Class\'+ Driver)) and
          (Reg.ReadBinaryData('PortSubClass',PortSubClass,1) = 1and
          (PortSubClass = 1and (Strings.IndexOf(PortName) < 0then
          Strings.Add(PortName);
      end;
    end;
    LName.Free;
    Reg.OpenKeyReadOnly(Key);
    if Reg.HasSubKeys then
    begin
      LKey := TStringList.Create;
      Reg.GetKeyNames(LKey);
      for i := 0 to LKey.Count - 1 do
      begin
        ScanRegEnum(Key + '\' + LKey[i]);
      end;
      LKey.Free;
    end;
  end;

var
  VersionInfo : TOSVersionInfo;
begin
  if CheckOS(VersionInfo) > 0 then
    if VersionInfo.dwMajorVersion >= 4 then
    begin
      Reg := TRegistry.Create;
      Reg.RootKey := HKEY_LOCAL_MACHINE;
      if VersionInfo.dwMajorVersion > 4 then ScanRegHardware //Win 2k, XP
      else if VersionInfo.dwMinorVersion > 0 then ScanRegEnum('\enum'//Win9x, mE
      else ScanRegHardware; //WinNT
      Reg.Free;
    end;
end;



Variante 2:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function ComAvailable(ComNr: byte): boolean;
var
  TestHandle : integer;
begin
  TestHandle :=
  CreateFile(PChar('\\.\COM'+IntToStr(ComNr)),GENERIC_READ or GENERIC_WRITE,0,
             nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,LongInt(0));
  if (TestHandle = -1then
    Result := false
  else
  begin
    Result := true;
    CloseHandle(TestHandle);
  end;
end;


Und dann:


Delphi-Quelltext
1:
2:
3:
4:
5:
for i:=1 to 255 do
begin
  if ComAvailable(i) then //mach was 
  else break;
end;