如:'Software/Microsoft/',是得到‘Microsoft’键下所有的子键,不是单纯用GetKeyNames只得到"Microsoft"下面的键。
我知道用递归的方法,但是程序老是出错。请各位帮帮忙。最好能把这种算法以程序的形式表达出来。不甚感激!

解决方案 »

  1.   

    uses Registry;function ScanRegistry(mRootKey: HKEY; mKey: string; mStrings: TStrings): Boolean; overload;
    var
      vRegistry: TRegistry;  procedure pScanRegistry(mKey: string);
      var
        vKeyNames: TStringList;
        I: Integer;
      begin
        vKeyNames := TStringList.Create;
        try
          vRegistry.CloseKey;
          vRegistry.RootKey := mRootKey;
          if not vRegistry.OpenKey(mKey, False) then Exit;
          mStrings.Add(mKey);
          vRegistry.GetKeyNames(vKeyNames);
          for I := 0 to vKeyNames.Count - 1 do
            pScanRegistry(mKey + '\' + vKeyNames[I]);
        finally
          vKeyNames.Free;
        end;
      end; { pScanRegistry }begin
      Result := False;
      if not Assigned(mStrings) then Exit;
      vRegistry := TRegistry.Create;
      mStrings.Clear;
      mStrings.BeginUpdate;
      try
        pScanRegistry(mKey);
      finally
        vRegistry.Free;
        mStrings.EndUpdate;
      end;
      Result := True;
    end; { ScanRegistry }function ScanRegistry(mRootKey: HKEY; mKey: string; mTreeView: TTreeView): Boolean; overload;
    var
      vRegistry: TRegistry;  procedure pScanRegistry(mTreeNode: TTreeNode; mKey: string);
      var
        vKeyNames: TStringList;
        vTreeNode: TTreeNode;
        I: Integer;
      begin
        vKeyNames := TStringList.Create;
        try
          vRegistry.CloseKey;
          vRegistry.RootKey := mRootKey;
          if not vRegistry.OpenKey(mKey, False) then Exit;
          vRegistry.GetKeyNames(vKeyNames);
          for I := 0 to vKeyNames.Count - 1 do begin
            vTreeNode := mTreeView.Items.AddChild(mTreeNode, vKeyNames[I]);
            pScanRegistry(vTreeNode, mKey + '\' + vKeyNames[I]);
          end;
        finally
          vKeyNames.Free;
        end;
      end; { pScanRegistry }begin
      Result := False;
      if not Assigned(mTreeView) then Exit;
      mTreeView.Items.Clear;
      vRegistry := TRegistry.Create;
      mTreeView.Items.BeginUpdate;
      try
        pScanRegistry(mTreeView.Items.AddChild(mTreeView.TopItem, mKey), mKey);
      finally
        vRegistry.Free;
        mTreeView.Items.EndUpdate;
      end;
      Result := True;
    end; { ScanRegistry }procedure TForm1.Button1Click(Sender: TObject);
    begin
      ScanRegistry(HKEY_CURRENT_USER, 'Software\Microsoft', Memo1.Lines);
      ScanRegistry(HKEY_CURRENT_USER, 'Software\Microsoft', TreeView1);
    end;
      

  2.   

    谢谢你:zswang(伴水清清)(专家门诊清洁工)
      

  3.   

    直接用TRegistry对象的GetKeyNames方法不是更加容易吗
      

  4.   

    谢谢 zswang(伴水清清)(专家门诊清洁工) 的回答!
    也帮助了所有有这方面需求的朋友!:)