Hi,
ich verwende immer diese Routine, die ich mir schon lange mal geschrieben habe:
Delphi-Quellcode:
function GetComAvailable: TStrings;
var
ValueNames: TStrings;
Res: TStringList;
i: integer;
s:
string;
begin
ValueNames := TStringList.Create;
Res := TStringList.Create;
with TRegistry.Create
do begin
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKeyReadOnly('
\HARDWARE\DEVICEMAP\SERIALCOMM\')
then begin
GetValueNames(ValueNames);
for i:=0
to ValueNames.Count-1
do begin
s := ReadString(ValueNames.Strings[I]);
if (Pos('
COM',UpperCase(s))=1)
and (Pos('
DEVICE',UpperCase(ValueNames.Strings[i]))<>0)
then Res.Add(Trim(s));
end;
end;
finally
CloseKey;
Free;
end;
end;
//sortieren
Res.Sorted := true;
Result := Res;
end;
Liefert auch zuverlässig alle aktuell vorhandenen Comports. Fie Abfrage auf "DEVICE" im String, wirft mir Modems raus. Aber ich habe keine Ahnung, wie ich die Friendlynames dazu finden soll. Schön wäre es, ich hätte Sie. Vorteil: Ich brauche die ganze
Jedi-
API nicht.
@Christian: Deine Methode 1 liefert mir Comports nicht, die von USB CDC-Klassen kommen. Bei dieser klasse können mehrere USB-Funktionen an einem Port hängen. Ich habe das im Zusammenhang mit ATMEL-Mikrocontrollern AT90USB162 und ähnlich. Da habe ich dann einen Port mit dem Friendlyname AT90USBxxx CDC USB to UART MGM (COM9), den Deine Methode1 nicht findet (Methode 2 natürlich schon).
Hast Du noch eine Idee, wie man entweder die CDC Klassen auch mit Deinem Code durchsucht, oder bei meiner Methode den Friendlyname noch findet?
Dieter