2014-02-12 73 views
1

我可以使用下面的代码成功查询已知密钥的值。我如何递归搜索子键(在下面的例子中,Uninstall文件夹中的所有子键)以获取特定数据的值?我的目标是查看是否安装了某个特定的程序,如果没有,安装它。递归搜索注册表

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; 
+2

Tlama给你一个答案,但应用程序通常使用固定ID,也许在主要版本升级时发生变化。应该不需要枚举它们来查找单个应用程序。 – Deanna

+0

这是一个好点,这是我还有的问题。我注意到我在寻找的应用程序在多台机器和安装中具有相同的GUID,但是因为我没有完全理解*应用程序在注册表中的标记方式,所以我选择了一个面向未来的但计算成本较高的路由。 – jdhurst

回答

3

的原理很简单,与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;