Почему моя функция Delphi не получает мои порты связи из реестра?

Мой код:

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

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumCommPorts(Memo1.Lines);
end;

На приведенном ниже снимке экрана показано, что определены 2 порта связи:

Однако, когда я нажимаю кнопку Memo1 остается пустым. Как это исправить?

2 ответа

Решение

У вас есть пара ошибок.

Прежде всего вы пытаетесь открыть реестр с правами записи. Вы не получите его как обычный пользователь с включенным UAC в HKLM.

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

Этот код будет работать:

Registry.RootKey := HKEY_LOCAL_MACHINE;
Registry.OpenKeyReadOnly('hardware\devicemap\serialcomm');
Registry.GetValueNames(aStrings);
procedure TForm1.GetCommList(cbx:TComboBox);
var
  reg: TRegistry;
  st: Tstrings;
  i: Integer;
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
        cbx.Items.Add(reg.Readstring(st.strings[i]));
    finally
      st.Free;
    end;
    reg.CloseKey;
  finally
    reg.Free;
  end;
end;
Другие вопросы по тегам