Énumération d'une liste de systèmes de ports de communication dans Delphi
-
03-07-2019 - |
Question
Objectif: j'aimerais pouvoir répertorier les ports COM disponibles sur un système Delphi.
Devoirs:
J'ai lu ce sujet SO sur l'énumération du LPT ports d’un système utilisant le registre. J'ai également constaté que les ports COM sont répertoriés dans le registre sous HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALCOMM
, mais j'ai trouvé une gesticulation sans réponse dans même fil que cela pourrait ne pas être fiable sur différentes machines et différentes versions de Windows.
J'ai également trouvé des articles faisant référence à l'utilisation de QueryDosDevice (), mais après avoir essayé cela exemple de code , j’ai constaté qu’il ne semblait pas lister de ports COM du tout.
Question: Quel est le moyen le plus fiable (à travers des versions Windows inconnues) de répertorier les ports COM sur un ordinateur Windows?
La solution
DEVICEMAP \ SERIALCOMM est bon pour toutes les versions de NT. Vous devrez probablement regarder sous DYN_DATA pour Win9x.
Utilisez cette méthode si vous avez besoin de la fiabilité de l'exécution.
Autres conseils
Veuillez passer par l'URL qui est écrite en C ++
http://www.codeproject.com/KB/system/serial_portsenum_fifo.aspx
et la même approche peut également être mise en œuvre dans Delphi .. ou quelqu'un peut convertir pour vous dans SO ..
Cela fonctionnera pour toutes les versions de Windows, car il fonctionne selon le principe du gestionnaire de périphériques, qui est disponible pour toutes les versions de fenêtres.
Ceci est le code pour LINUX pas pour WINDOWS ....
function GetSerialPortNames: string;
var
Index: Integer;
Data: string;
TmpPorts: String;
sr : TSearchRec;
begin
try
TmpPorts := '';
if FindFirst('/dev/ttyS*', $FFFFFFFF, sr) = 0 then
begin
repeat
if (sr.Attr and $FFFFFFFF) = Sr.Attr then
begin
data := sr.Name;
index := length(data);
while (index > 1) and (data[index] <> '/') do
index := index - 1;
TmpPorts := TmpPorts + ' ' + copy(data, 1, index + 1);
end;
until FindNext(sr) <> 0;
end;
FindClose(sr);
finally
Result:=TmpPorts;
end;
end;