为什么我的 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;
我的代码:
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;