1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

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

Тема в разделе "Inno Setup", создана пользователем Хамик, 13 май 2014.

  1. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    В составе Inno Ultra нашел скрипт создающего резервную копию ключа в реестре. Так вот мне нужно в том коде прописать HKU\{code:UsSID}\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts вместо HKCR, но у меня не получается, помогите, пожалуйста. На {code:UsSID} не обращайте внимание, мне главное покажите как ключ с подключами указать.
    Код (Text):
    [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;
     
     
    Последнее редактирование: 14 май 2014
  2. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Делаю так, то при компиляции ошибок нету, но при установке выскакивает ошибка:
    [​IMG]
    Код (Text):
    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;
     
  3. Тех. админ Администратор

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Код (Text):
    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;
    ЗЫ. Работоспособность не проверял, только поправил ваши функции
     
    Хамик нравится это.
  4. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Спасибо! Сработало. Я понял что этот код только значение ключа копирует, не подскажите как сделать чтобы ключ полностью копировался со всеми своими значениями и подключами?
     
  5. Тех. админ Администратор

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Хамик, если вы хотите бэкапить и восстанавливать именно ассоциации файлов, то это не совсем корректный способ. Поясню: на момент, когда вы будете восстанавливать ассоциацию, программы, с которой расширение было ассоциировано до того, уже может не быть в системе.
    Потому конкретно для ассоциаций, это не совсем правильный способ.
    Ну а для создания бэкапов веток реестра можно использовать виндовую regedit.exe. К примеру сохранить нужную ветку в .reg файлик, а потом восстановить во время деинсталляции.
    Код (Text):
    [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 нет под рукой
     
    Хамик нравится это.
  6. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    Спасибо! Код работает! Но у меня около 30 форматов ассоциации и хотелось бы чтобы то что бекапится записывалось в один файл бекапа. Можно такое сделать?

    Проверил восстановление при удалении то есть ошибка [​IMG]
     
    Последнее редактирование: 15 май 2014
  7. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    А какой вообще правильный? Бекап в reg файл получается тоже самое что и бекап в самом реестре, тоже может не быть уже программы в системе.
     
  8. Тех. админ Администратор

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Поправил

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


    Это лишь пример создания бэкапов веток реестра. Для примера просто использовал ваши ключи :)
     
  9. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    YURSHAT, Ну ошибки уже нету, но файл бекапа не удаляется после восстановления. И как больше прописать веток реестра?
    Код (Text):

    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;
     
    Такой способ не работает, создается бекап вот с таким содержимым
    Код (Text):
    Windows Registry Editor Version 5.00

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

    Регистрация:
    26 дек 2011
    Сообщения:
    514
    Симпатии:
    601
    Пол:
    Мужской
    Хм, не знаю, у меня все корректно работает
    Код (Text):
    [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;
     
    Хамик нравится это.
  11. Ветеран

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    А в секции [Registry] ничего не нужно указывать?
     
  12. Ветеран

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

    Регистрация:
    27 мар 2014
    Сообщения:
    313
    Симпатии:
    54
    Пол:
    Мужской
    YURSHAT, что-то процедура RestoreData не работает, а саме, наверное, функция ImportRegFile..... бекапит уже норм (просто в procedure CurStepChanged вместо ssPostInstall я написал ssInstall), но почему-то не восстанавливает. Можете что-то посоветовать?
     
    Последнее редактирование: 16 май 2014

Поделиться этой страницей