2009-03-05 3 views
1

Цель: Я хотел был бы иметь возможность показать имеющиеся COM-порты в системе в Delphi.Перечисление списка систем Com Порты в Delphi

Домашнее задание: Я прочитал this SO нити на перечисление LPT портов системы с помощью реестра. Я также обнаружил, что COM-порты перечислены в реестре по адресу HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM, но нашли безответную жестикуляцию в same thread, что это может быть ненадежным на разных машинах и в разных версиях окон.

Я также нашел статьи, ссылающиеся на использование QueryDosDevice(), но при попытке this sample code я обнаружил, что он вообще не отображал никаких COM-портов.

Вопрос: Что является самым надежным способом (через неизвестные версии Windows) для отображения COM-портов на Windows-машине?

ответ

1

DEVICEMAP\SERIALCOMM подходит для всех версий NT. Вероятно, вам придется искать под DYN_DATA для Win9x.

Используйте this method, если вам нужна надежность во время работы.

+0

Это выглядит как лучший способ, но если я правильно читаю документацию, он создается при запуске. Означает ли это, что Serial Devices, добавленные после загрузки, не будут присутствовать? – jamiei

+0

Это действительно проблема? –

+0

Наверное, нет. Но поскольку устройство действительно использует USB для последовательного моста, это может смутить нескольких людей, которые привыкли подключать USB-устройства после загрузки. – jamiei

0

Это код LINUX не 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; 
+0

Спасибо, но это дало мне пустую строку на целевой машине. – jamiei

+0

Извините, что отправил неправильную функцию. Он используется для Linux. – SimaWB

+0

Вы знаете, что можете ИЗМЕНИТЬ свои ответы и исправить их, чтобы они не были НЕПРАВИЛЬНЫМИ, не так ли? Или удалите их, чтобы спасти людей от выяснения, что они не правы, попробовав их. –

1

Перейди через URL, который написан на C++

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

и такой же подход может быть реализован в Дельфах тоже .. или кто-то может конвертировать для вас в SO ..

Это будет работать для всех окон, так как это работает по принципу устройства человека ager, доступный для всех версий окна.

+0

Упрощенный метод (в C) в ответе на другой вопрос SO: http://stackoverflow.com/questions/1205383/listing-serial-com-ports-on-windows/3018813#3018813 – tomlogic

Смежные вопросы