Почему моя функция 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;