不用TRegistry,如何用API枚举某键下面的subkey 和value?
谁有没有用API操作注册表的完整的API例子(包括枚举,读取各种类型的值)?
找了很久,没找到,哪们知道,指教一下,谢!

解决方案 »

  1.   

    你可以去看一下TRegistry的实现呀!
      

  2.   

    多谢 phoex(后羿)兄指教。
    我看过TRegistry,但是它太对象化了,每个东西都对象化,因此显得有点过于繁杂
    自己一个一个去找,再写,有点麻烦。
    想直接找个大家写好了来用用。
      

  3.   

    function RegEnum(RootKey:HKEY;Name:String;var ResultList:String;const DoKeys:Boolean):boolean;
    var       //枚举
      i:integer;
      iRes:integer;
      s:String;
      hTemp:HKEY;
      Buf:Pointer;
      BufSize:Cardinal;
    begin
      Result:=False;
      ResultList:='';
      if RegOpenKeyEx(RootKey,PChar(Name),0,KEY_READ,hTemp)=ERROR_SUCCESS then
         begin
           Result:=True;
           BufSize:=1024;
           GetMem(buf, BufSize);
           i:=0;
         iRes := ERROR_SUCCESS;
         while iRes=ERROR_SUCCESS do
         begin
         BufSize:=1024;
         if DoKeys then
         iRes:=RegEnumKeyEx(hTemp,i,buf,BufSize,nil,nil,nil,nil)
         else
         iRes:=RegEnumValue(hTemp,i,buf,BufSize,nil,nil,nil,nil);
         if iRes=ERROR_SUCCESS then
         begin
         SetLength(s,BufSize);
         Move(buf^,s[1],BufSize);
         if ResultList='' then
         ResultList:=s
         else
         ResultList:=Concat(ResultList,#13#10,s);
         inc(i);
         end;
         end;
         FreeMem(buf);
         RegCloseKey(hTemp);
         end;
    end;procedure TForm1.Button1Click(Sender: TObject); //读取键值
    var hKey1:HKEY;
        size:Cardinal;
        value:array[0..255]of char;
    begin
      RegOpenKeyEx(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion',0,KEY_READ,hKey1);
      RegQueryValueEx(hKey1,'CommonFilesDir',nil,nil,@value,@size);
      ShowMessage(value);
      RegCloseKey(hKey1);
    end;procedure TForm1.Button2Click(Sender: TObject);
    var s:string;
    begin
      RegEnum(HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows\CurrentVersion',s,False);
      ShowMessage(s);
    end;
      

  4.   

    function RegGetValueNames(const RootKey: HKEY; const SubKey: string; Names: TStrings): Boolean;
    {
      返回注册表中指定主键下的所有的键名列表
    }
    var
      RegKey: HKEY;
      I: DWORD;
      Size: DWORD;
      NumSubKeys: DWORD;
      NumSubValues: DWORD;
      MaxSubValueLen: DWORD;
      ValueName: string;
    begin
      Result := False;
      if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, RegKey) = ERROR_SUCCESS then
      begin
        if RegQueryInfoKey(RegKey, nil, nil, nil, @NumSubKeys, nil, nil, @NumSubValues, @MaxSubValueLen, nil, nil, nil) = ERROR_SUCCESS then
        begin
          SetLength(ValueName, MaxSubValueLen + 1);
          if NumSubValues <> 0 then
            for I := 0 to NumSubValues - 1 do
            begin
              Size := MaxSubValueLen + 1;
              RegEnumValue(RegKey, I, PChar(ValueName), Size, nil, nil, nil, nil);
              Names.Add(PChar(ValueName));
            end;
          Result := True;
        end;
        RegCloseKey(RegKey);
      end;
    end;function RegGetKeyNames(const RootKey: HKEY; const SubKey: string; Names: TStrings): Boolean;
    {
      返回注册表中指定主键下的所有子键的名称列表
    }
    var
      RegKey: HKEY;
      I: DWORD;
      Size: DWORD;
      NumSubKeys: DWORD;
      MaxSubKeyLen: DWORD;
      KeyName: string;
    begin
      Result := False;
      if RegOpenKeyEx(RootKey, PChar(SubKey), 0, KEY_READ, RegKey) = ERROR_SUCCESS then
      begin
        if RegQueryInfoKey(RegKey, nil, nil, nil, @NumSubKeys, @MaxSubKeyLen, nil, nil, nil, nil, nil, nil) = ERROR_SUCCESS then
        begin
          SetLength(KeyName, MaxSubKeyLen + 1);
          if NumSubKeys <> 0 then
            for I := 0 to NumSubKeys - 1 do
            begin
              Size := MaxSubKeyLen + 1;
              RegEnumKeyEx(RegKey, I, PChar(KeyName), Size, nil, nil, nil, nil);
              Names.Add(PChar(KeyName));
            end;
          Result := True;
        end;
        RegCloseKey(RegKey);
      end
    end;