Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Устранение проблемы с доступом к COM-портам в Delphi: пошаговое решение

Delphi , ОС и Железо , Реестр

Разработчики, работающие с Delphi, часто сталкиваются с необходимостью взаимодействия с аппаратным обеспечением компьютера, в том числе с COM-портами. В данной статье мы рассмотрим, как решить проблему, связанную с чтением информации о COM-портах из реестра Windows, используя объект Pascal (Delphi).

Описание проблемы

Пользователь столкнулся с проблемой, когда, несмотря на наличие определённых COM-портов в реестре, его функция на языке Object Pascal (Delphi) не могла их обнаружить. Код, предназначенный для перечисления COM-портов, не работал корректно, и информация не отображалась в Memo-контроле.

Анализ и устранение ошибок

Ошибка 1: Неправильный доступ к реестру

Первой ошибкой в коде является попытка открыть ключ реестра с правом записи. Это недопустимо для стандартного пользователя в системах с включенным UAC (User Account Control) и для ключа HKEY_LOCAL_MACHINE.

Ошибка 2: Использование некорректного метода

Вторая ошибка заключается в использовании метода GetKeyNames. Этот метод возвращает имена всех подключей, но в случае с узлом SERIALCOMM подключей нет, и нужно использовать метод GetValueNames.

Исправленный код

Исправленный код должен открывать ключ реестра только для чтения и использовать метод GetValueNames для получения списка COM-портов. Пример кода:

procedure EnumCommPorts(aStrings: TStrings);
var
  Registry: TRegistry;
begin
  Registry := TRegistry.Create;
  try
    Registry.RootKey := HKEY_LOCAL_MACHINE;
    Registry.OpenKeyReadOnly('hardware\devicemap\serialcomm');
    Registry.GetValueNames(aStrings);
  finally
    Registry.Free;
  end;
end;

Получение данных о COM-портах

Для получения самих данных о COM-портах, таких как "COM7", "COM9", необходимо использовать метод ReadString объекта TRegistry. Пример кода для заполнения TComboBox доступными COM-портами:

procedure TForm1.GetCommList(cbx: TComboBox);
var
  reg: TRegistry;
  st: TStringList;
  i: Integer;
  valueName: string;
begin
  reg := TRegistry.Create;
  try
    cbx.Clear;
    reg.RootKey := HKEY_LOCAL_MACHINE;
    reg.OpenKeyReadOnly('hardware\devicemap\serialcomm');
    st := TStringList.Create;
    try
      reg.GetValueNames(st);
      for i := 0 to st.Count - 1 do
      begin
        valueName := st[i];
        cbx.Items.Add(reg.ReadString(valueName));
      end;
    finally
      st.Free;
    end;
    reg.CloseKey;
  finally
    reg.Free;
  end;
end;

Этот код сначала получает список имен значений, а затем читает каждое значение, чтобы получить соответствующий COM-порт.

Заключение

В данной статье мы рассмотрели типичную проблему, с которой сталкиваются разработчики в Delphi при работе с COM-портами, и предоставили пошаговое решение. Исправление ошибок в доступе к реестру и использование правильных методов позволило успешно решить задачу. Надеемся, что эти рекомендации помогут вам в вашей работе.

Создано по материалам из источника по ссылке.

Разработчики на Delphi сталкиваются с трудностями при чтении информации о COM-портах из реестра Windows, что приводит к ошибкам в работе кода, и требуется пошаговое решение для корректного обнаружения и использования COM-портов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Реестр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-13 21:06:50/0.0034599304199219/0