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;