Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 1133
Благодарности: 581

Профиль | Отправить PM | Цитировать


Цитата R.i.m.s.k.y.:
Подскажите пожалуйста, как можно сохранить в Inno изменяемые ветки реестра перед установкой программы (желательно автоматом, уж больно много), и восстановить реестр при деинсталляции программы? »
Пример
Код: Выделить весь код
[Setup]
AppName=RegBackup
AppVerName=Registry Backup
CreateAppDir=false

[Registry]
;если используется функция RegBackup, то желательно удалять ключ или параметр при деинсталляции (флаги deletevalue или uninsdeletekey), чтобы не оставались записи реестра, которых не было до установки.
Root: HKCU; SubKey: Control Panel\Desktop; ValueType: none; ValueName: Wallpaper; Flags: deletevalue uninsdeletevalue; BeforeInstall: RegBackup('HKCU\Control Panel\Desktop')

[Run]
Filename: {uninstallexe}; Flags: nowait postinstall; Description: Восстановить обои Рабочего стола; Parameters: /SILENT
Filename: {cmd}; Parameters: /C del /F /Q /AH IconCache.db; Flags: runhidden nowait; WorkingDir: {code:GetFolderByCSIDL|28}

[code]
function SystemParametersInfo(uAction, uParam: integer; pvParam: longint; fUpdateProfile: integer): boolean; external 'SystemParametersInfoA@user32';

// получить путь к папке. Пример: DestDir: {code:GetFolderByCSIDL|28}
function GetFolderByCSIDL(CSIDL: String): String;
begin
  Result:= GetShellFolderByCSIDL(StrToInt(CSIDL), true);
end;

// Зарезервировать параметры указанного раздела реестра или Восстановить записи реестра из резервной копии
Procedure RegBackup(Path: String);
var
  errCode, n: Integer;
  RegExe, isKey: String;
  Keys: TArrayOfString;
begin
  RegExe:= AddBackslash(GetSystemDir) + 'reg.exe'
  if not FileExists(RegExe) then begin
    MsgBox('Registry backup not created' #13#10 'File reg.exe not found!', mbError, MB_OK);
    Exit;
  end;
	isKey:= 'HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting('AppName')}_regBackup'	{! InnoSetup удаляет чужие ключи в AppName_is1}
	if Length(Path) > 0 then
		Exec(RegExe,'copy '+ AddQuotes(Path) +' '+ AddQuotes(AddBackslash(isKey) + Path) +' /s /f','',sw_HIDE, ewWaitUntilTerminated, errCode)
	else begin
		if not RegGetSubkeyNames(HKLM, Copy(isKey, 6,Length(isKey)), Keys) then Exit; { нет резервных записей}
	for n:= 0 to GetArrayLength(Keys) -1 do	{ reg.exe не может сохранять в корень реестра}
		Exec(RegExe, 'copy '+ AddQuotes(AddBackslash(isKey) + Keys[n]) +' '+ Keys[n] +' /s /f','', sw_HIDE, ewWaitUntilTerminated, errCode)
  	RegDeleteKeyIncludingSubkeys(HKLM, Copy(isKey, 6,Length(isKey)))
	end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then SystemParametersInfo(20,0,0,2) { update Desktop}
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
	if CurUninstallStep = usPostUninstall then begin
    RegBackup(''); SystemParametersInfo(20,0,0,2)
  end;
end;

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Отправлено: 16:48, 22-06-2009 | #986