Проблема Помогите переделать скрипт

Хамик

Старожил
В составе Inno Ultra нашел скрипт создающего резервную копию ключа в реестре. Так вот мне нужно в том коде прописать HKU\{code:UsSID}\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts вместо HKCR, но у меня не получается, помогите, пожалуйста. На {code:UsSID} не обращайте внимание, мне главное покажите как ключ с подключами указать.
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
ChangesAssociations=yes

[Tasks]
Name: MostVideo; Description: "Most Video Files "; GroupDescription: Associate Video Files:
Name: MostVideo\DiracVideo; Description: Dirac; GroupDescription: Associate Video Files:
Name: MostVideo\AviVideo; Description: AVI; GroupDescription: Associate Video Files:
Name: MostVideo\MP4Video; Description: MP4; GroupDescription: Associate Video Files:

[Files]
Source: Files\new.ext1; DestDir: {app}
Source: Files\new.ext2; DestDir: {app}
Source: Files\new.ext3; DestDir: {app}

[Registry]
; .ext1
Root: HKCR; Subkey: .ext1; ValueType: string; ValueName: ; ValueData: MyProgramFile1; Flags: uninsdeletevalue; Tasks: MostVideo\DiracVideo; BeforeInstall: BackupData('ext1')
Root: HKCR; Subkey: MyProgramFile1; ValueType: string; ValueName: ; ValueData: "My Program File ¹1"; Flags: uninsdeletekey; Tasks: MostVideo\DiracVideo
Root: HKCR; Subkey: MyProgramFile1\DefaultIcon; ValueType: string; ValueName: ; ValueData: {sys}\notepad.exe,0; Tasks: MostVideo\DiracVideo
Root: HKCR; Subkey: MyProgramFile1\shell\open\command; ValueType: string; ValueName: ; ValueData: """{sys}\notepad.exe"" ""%1"""; Tasks: MostVideo\DiracVideo
; .ext2
Root: HKCR; Subkey: .ext2; ValueType: string; ValueName: ; ValueData: MyProgramFile2; Flags: uninsdeletevalue; Tasks: MostVideo\AviVideo; BeforeInstall: BackupData('ext2')
Root: HKCR; Subkey: MyProgramFile2; ValueType: string; ValueName: ; ValueData: "My Program File ¹2"; Flags: uninsdeletekey; Tasks: MostVideo\AviVideo
Root: HKCR; Subkey: MyProgramFile2\DefaultIcon; ValueType: string; ValueName: ; ValueData: {sys}\notepad.exe,0; Tasks: MostVideo\AviVideo
Root: HKCR; Subkey: MyProgramFile2\shell\open\command; ValueType: string; ValueName: ; ValueData: """{sys}\notepad.exe"" ""%1"""; Tasks: MostVideo\AviVideo
; .ext3
Root: HKCR; Subkey: .ext3; ValueType: string; ValueName: ; ValueData: MyProgramFile3; Flags: uninsdeletevalue; Tasks: MostVideo\MP4Video; BeforeInstall: BackupData('ext3')
Root: HKCR; Subkey: MyProgramFile3; ValueType: string; ValueName: ; ValueData: "My Program File ¹3"; Flags: uninsdeletekey; Tasks: MostVideo\MP4Video
Root: HKCR; Subkey: MyProgramFile3\DefaultIcon; ValueType: string; ValueName: ; ValueData: {sys}\notepad.exe,0; Tasks: MostVideo\MP4Video
Root: HKCR; Subkey: MyProgramFile3\shell\open\command; ValueType: string; ValueName: ; ValueData: """{sys}\notepad.exe"" ""%1"""; Tasks: MostVideo\MP4Video

[Code]
procedure BackupData(FileExt: String);
var
  OldValueData: string;
begin
  if RegKeyExists(HKCR, '.' + FileExt) then
    begin
      RegQueryStringValue(HKCR, '.' + FileExt, '', OldValueData);
      RegWriteStringValue(HKCR, '.' + FileExt + '(backup)', '', OldValueData);
    end;
end;

procedure RestoreData(FileExt: String);
var
  OldValueData: string;
begin
  if RegKeyExists(HKCR, '.' + FileExt + '(backup)') then
    begin
      RegQueryStringValue(HKCR, '.' + FileExt + '(backup)', '', OldValueData);
      RegWriteStringValue(HKCR, '.' + FileExt, '', OldValueData);
      RegDeleteKeyIncludingSubkeys(HKCR, '.' + FileExt + '(backup)');
    end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then
    begin
      RestoreData('ext1');
      RestoreData('ext2');
      RestoreData('ext3');
    end;
end;
 
Последнее редактирование:

Хамик

Старожил
Делаю так, то при компиляции ошибок нету, но при установке выскакивает ошибка:

Код:
procedure BackupData(FileExt: String);
var
  OldValueData: string;
begin
  if RegKeyExists(ExpandConstant('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts'), '.' + FileExt) then
    begin
      RegQueryStringValue(ExpandConstant('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts'), '.' + FileExt, '', OldValueData);
      RegWriteStringValue(ExpandConstant('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts'), '.' + FileExt + '(backup)', '', OldValueData);
    end;
end;

procedure RestoreData(FileExt: String);
var
  OldValueData: string;
begin
  if RegKeyExists(ExpandConstant('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts'), '.' + FileExt + '(backup)') then
    begin
      RegQueryStringValue(ExpandConstant('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts'), '.' + FileExt + '(backup)', '', OldValueData);
      RegWriteStringValue(ExpandConstant('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts'), '.' + FileExt, '', OldValueData);
      RegDeleteKeyIncludingSubkeys(ExpandConstant('HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts'), '.' + FileExt + '(backup)');
    end;
end;
 

YURSHAT

Тех. админ
Администратор
Делаю так, то при компиляции ошибок нету, но при установке выскакивает ошибка
Код:
procedure BackupData(FileExt: String);
var
  OldValueData: string;
begin
  if RegKeyExists(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt) then
  begin
    RegQueryStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt, '', OldValueData);
    RegWriteStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt + '(backup)', '', OldValueData);
  end;
end;

procedure RestoreData(FileExt: String);
var
  OldValueData: string;
begin
  if RegKeyExists(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt + '(backup)') then
  begin
    RegQueryStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt + '(backup)', '', OldValueData);
    RegWriteStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt, '', OldValueData);
    RegDeleteKeyIncludingSubkeys(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt + '(backup)');
  end;
end;
ЗЫ. Работоспособность не проверял, только поправил ваши функции
 

Хамик

Старожил
ЗЫ. Работоспособность не проверял, только поправил ваши функции
Спасибо! Сработало. Я понял что этот код только значение ключа копирует, не подскажите как сделать чтобы ключ полностью копировался со всеми своими значениями и подключами?
 

YURSHAT

Тех. админ
Администратор
Хамик, если вы хотите бэкапить и восстанавливать именно ассоциации файлов, то это не совсем корректный способ. Поясню: на момент, когда вы будете восстанавливать ассоциацию, программы, с которой расширение было ассоциировано до того, уже может не быть в системе.
Потому конкретно для ассоциаций, это не совсем правильный способ.
Ну а для создания бэкапов веток реестра можно использовать виндовую regedit.exe. К примеру сохранить нужную ветку в .reg файлик, а потом восстановить во время деинсталляции.
Код:
[Code]
function ExportRegKey(const FileName, Key: String): Boolean;
var
  ResultCode: Integer;
begin
  Result := Exec(ExpandConstant('{win}\regedit.exe'), Format('/e "%s" "%s"', [FileName, Key]), '',
    SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;

function ImportRegFile(const FileName: String): Boolean;
var
  ResultCode: Integer;
begin
  Result := Exec(ExpandConstant('{win}\regedit.exe'), FileName, '/s',
    SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;

procedure BackupData(FileExt: String);
begin
  if RegKeyExists(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt) then
    ExportRegKey(ExpandConstant('{win}\_') + FileExt + '.backup.reg',
      'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt);
end;

procedure RestoreData(FileExt: String);
var
  FileName: String;
begin
  FileName := ExpandConstant('{win}\_') + FileExt + '.backup.reg';
  if FileExists(FileName) then
  begin
    ImportRegFile(FileName);
    DeleteFile(FileName);
  end;
end;
ЗЫ. Работоспособность примера не проверял, Inno нет под рукой
 

Хамик

Старожил
если вы хотите бэкапить и восстанавливать именно ассоциации файлов, то это не совсем корректный способ. Поясню: на момент, когда вы будете восстанавливать ассоциацию, программы, с которой расширение было ассоциировано до того, уже может не быть в системе.
Потому конкретно для ассоциаций, это не совсем правильный способ.
Ну а для создания бэкапов веток реестра можно использовать виндовую regedit.exe. К примеру сохранить нужную ветку в .reg файлик, а потом восстановить во время деинсталляции.
Спасибо! Код работает! Но у меня около 30 форматов ассоциации и хотелось бы чтобы то что бекапится записывалось в один файл бекапа. Можно такое сделать?

Проверил восстановление при удалении то есть ошибка
 
Последнее редактирование:

YURSHAT

Тех. админ
Администратор
Проверил восстановление при удалении то есть ошибка
Поправил

А какой вообще правильный?
Не восстанавливать старые ассоциации, так как неизвестно, есть ли в системе софт с которым была ассоциация на момент когда вы ее сменили.


Бекап в reg файл получается тоже самое что и бекап в самом реестре
Это лишь пример создания бэкапов веток реестра. Для примера просто использовал ваши ключи :)
 

Хамик

Старожил
YURSHAT, Ну ошибки уже нету, но файл бекапа не удаляется после восстановления. И как больше прописать веток реестра?
Код:
Root: HKCR; Subkey: .mp3; Check: AudioCheck; BeforeInstall: BackupData('mp3');  Flags: uninsdeletevalue
Root: HKCR; Subkey: .mp3; Check: AudioCheck; Flags: deletekey
Root: HKCR; Subkey: .mp3; ValueType: string; ValueData: WindowsPlayer.Audio; Check: AudioCheck; Flags: uninsdeletevalue
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice; ValueType: string; ValueName: Progid; ValueData: WindowsPlayer.Audio; BeforeInstall: ChangeLabel('reg'); Check: AudioCheck; Flags: uninsclearvalue

procedure BackupData(FileExt: String);
begin
  if RegKeyExists(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt) then
    ExportRegKey(ExpandConstant('{win}\_') + FileExt + '.backup.reg',
      'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt);
  if RegKeyExists(HKCR, '.' + FileExt) then
    ExportRegKey(ExpandConstant('{win}\_') + FileExt + '.backup.reg',
      'HKEY_CLASSES_ROOT\.' + FileExt);
end;

procedure RestoreData(FileExt: String);
var
  FileName: String;
begin
  FileName := ExpandConstant('{win}\_') + FileExt + '.backup.reg';
  if FileExists(FileName) then
  begin
    ImportRegFile(FileName);
    DeleteFile(FileName);
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then
    begin
      RestoreData('mp3');
      end;
end;
Такой способ не работает, создается бекап вот с таким содержимым
Код:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.mp3]
@="WindowsPlayer.Audio"
Хоч там должно быть AIMP.AssocFile.MP3. Почему так?
 
Последнее редактирование:

YURSHAT

Тех. админ
Администратор
Такой способ не работает, создается бекап вот с таким содержимым
Хм, не знаю, у меня все корректно работает
Код:
[Setup]
AppName=Моя программа
AppVersion=1.5
DefaultDirName={pf}\Моя программа

[Languages]
Name: "RU"; MessagesFile: "compiler:Languages\Russian.isl"

[Code]
function ExportRegKey(const FileName, Key: String): Boolean;
var
  ResultCode: Integer;
begin
  Result := Exec(ExpandConstant('{win}\regedit.exe'), Format('/e "%s" "%s"', [FileName, Key]), '',
    SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;

function ImportRegFile(const FileName: String): Boolean;
var
  ResultCode: Integer;
begin
  Result := Exec(ExpandConstant('{win}\regedit.exe'), FileName, '/s',
    SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;

procedure BackupData(FileExt: String);
begin
  if RegKeyExists(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt) then
    if not DirExists(ExpandConstant('{win}\_Exts.backup\_')) then
      CreateDir(ExpandConstant('{win}\_Exts.backup'));
    ExportRegKey(ExpandConstant('{win}\_Exts.backup\_') + FileExt + '.backup.reg',
      'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.' + FileExt);
end;

procedure RestoreData(FileExt: String);
var
  FileName: String;
begin
  FileName := ExpandConstant('{win}\_Exts.backup\_') + FileExt + '.backup.reg';
  if FileExists(FileName) then
  begin
    ImportRegFile(FileName);
    DeleteFile(FileName);
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    BackupData('mp3');
    BackupData('avi');
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usPostUninstall then
  begin
    RestoreData('mp3');
    RestoreData('avi');
    DelTree(ExpandConstant('{win}\_Exts.backup'), True, True, True);
  end;
end;
 

Хамик

Старожил
YURSHAT, Вы наверное не поняли о чем я говорил, надо создать бекап в двух ветках: по пути
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\. и по HKCR\.
И код создает бекап после внесение изменений, а не до....
 
Последнее редактирование:

Хамик

Старожил
YURSHAT, что-то процедура RestoreData не работает, а саме, наверное, функция ImportRegFile..... бекапит уже норм (просто в procedure CurStepChanged вместо ssPostInstall я написал ssInstall), но почему-то не восстанавливает. Можете что-то посоветовать?
 
Последнее редактирование:
Сверху