Pregunta

Objetivo: Me gustaría poder listar los puertos COM disponibles en un sistema en Delphi.

Tarea: He leído este subproceso SO en la enumeración del LPT puertos de un sistema que usa el registro. También descubrí que los puertos COM están listados en el registro en HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALCOMM pero encontré una gesticulación sin respuesta en mismo hilo que esto podría no ser confiable en diferentes máquinas y diferentes versiones de Windows.

También encontré artículos que hacen referencia al uso de QueryDosDevice () pero al intentar esto código de ejemplo , encontré que no parecía enumerar ningún puerto COM en absoluto.

Pregunta: ¿Cuál es la forma más confiable (a través de versiones desconocidas de Windows) para enumerar los puertos COM en una máquina con Windows?

¿Fue útil?

Solución

DEVICEMAP \ SERIALCOMM es bueno para todas las versiones de NT. Probablemente deba buscar en DYN_DATA para Win9x.

Utilice este método si necesita fiabilidad en tiempo de ejecución.

Otros consejos

Por favor, vaya a través de la URL que está escrita en C ++

http://www.codeproject.com/KB/system/serial_portsenum_fifo.aspx

y se puede implementar el mismo enfoque en Delphi también ... o alguien puede convertir para ti en SO ..

Esto funcionará para todas las versiones de Windows ya que funciona desde el principio del administrador de dispositivos que está disponible para todas las versiones de ventana.

Este es el código para LINUX no para 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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top