为什么我的 Delphi 函数不能从注册表中获取我的 com 端口?

Why doesn't my Delphi function get my comm ports from the registry?

我的代码:

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 仍然是空的。我该如何解决这个问题?

你有几个错误。

首先,您正试图以写入权限打开注册表。在 HKLM 下,启用 UAC 的标准用户不会得到它。

其次,您错误地调用了 GetKeyNames。即 returns 所有子键的名称。 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;