procedure RegCopyKey(const SourceRootKey: Integer; SourceSubKeyName: String; const TargetRootKey: Integer; TargetSubKeyName: String; const Level: Integer); var Keys: TArrayOfString; Names: TArrayOfString; ValueS: String; ValueD: Cardinal; I: Integer; begin if SourceSubKeyName[1] = '\' then Delete(SourceSubKeyName,1,1); if TargetSubKeyName[1] = '\' then Delete(TargetSubKeyName,1,1); if SourceSubKeyName[Length(SourceSubKeyName)] = '\' then Delete(SourceSubKeyName,Length(SourceSubKeyName),1); if TargetSubKeyName[Length(TargetSubKeyName)] = '\' then Delete(TargetSubKeyName,Length(TargetSubKeyName),1); if RegGetValueNames(SourceRootKey, SourceSubKeyName, Names) then for I := 0 to GetArrayLength(Names)-1 do if RegQueryStringValue(SourceRootKey, SourceSubKeyName, Names[I], ValueS) then RegWriteStringValue(TargetRootKey, TargetSubKeyName, Names[I], ValueS) else if RegQueryMultiStringValue(SourceRootKey, SourceSubKeyName, Names[I], ValueS) then RegWriteMultiStringValue(TargetRootKey, TargetSubKeyName, Names[I], ValueS) else if RegQueryDWordValue(SourceRootKey, SourceSubKeyName, Names[I], ValueD) then RegWriteDWordValue(TargetRootKey, TargetSubKeyName, Names[I], ValueD) else if RegQueryBinaryValue(SourceRootKey, SourceSubKeyName, Names[I], ValueS) then RegWriteBinaryValue(TargetRootKey, TargetSubKeyName, Names[I], ValueS); if Level <= 0 then Exit; if RegGetSubkeyNames(SourceRootKey, SourceSubKeyName, Keys) then for I := 0 to GetArrayLength(Keys)-1 do RegCopyKey(SourceRootKey, SourceSubKeyName + '\' + Keys[I], TargetRootKey, TargetSubKeyName + '\' + Keys[I], Level-1); end;