我可以使用下面的代码成功地查询一个已知的Key的值。 我如何recursionsearch子键(在我的例子中,在卸载文件夹中的所有子项)为特定的数据的价值? 我的目标是看看是否安装了某个特定的程序,如果没有,安装它。
function ...(omitted) var Res : String; begin RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{92EA4162-10D1-418A-91E1-5A0453131A38}','DisplayName', Res); if Res <> 'A Value' then begin // Successfully read the value MsgBox('Success: ' + Res, mbInformation, MB_OK); end end;
原理很简单,使用RegGetSubkeyNames
您将获得某个键的子键数组,然后您只需迭代该数组,然后查询DisplayName
值的所有子键,然后将该值与搜索到的值进行比较(如果有)。
以下函数显示了实现。 请注意,我已经从路径中删除了Wow6432Node
节点,所以如果您确实需要它,请修改代码中的UnistallKey
常量:
[Code] const UnistallKey = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'; function IsAppInstalled(const DisplayName: string): Boolean; var S: string; I: Integer; SubKeys: TArrayOfString; begin Result := False; if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, UnistallKey, SubKeys) then begin for I := 0 to GetArrayLength(SubKeys) - 1 do begin if RegQueryStringValue(HKEY_LOCAL_MACHINE, UnistallKey + '\' + SubKeys[I], 'DisplayName', S) and (S = DisplayName) then begin Result := True; Exit; end; end; end else RaiseException('Opening the uninstall key failed!'); end;