2014-02-12 3 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 дал вам ответ, но приложения обычно используют фиксированные идентификаторы, может быть, изменяясь при обновлении основной версии. Не должно быть необходимости перечислять их, чтобы найти одно приложение. – 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; 
Смежные вопросы