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

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 8]

Закрытая тема
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 8]

Аватара для El Sanchez

Ветеран


Contributor


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


Конфигурация

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


Изменения
Автор: El Sanchez
Дата: 22-10-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:

Показать/скрыть: Ссылки на примеры скриптов:

Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;

  • RegExporter - Фриварная утилита для экспорта реестра и конвертации файлов *.reg и *.ini в инсталляционные скрипты Inno Setup и NSIS.
    Последняя версия: 1.2.0 [23.09.2014] - Скачать;



Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Скрипты Inno Setup. Помощь и советы [часть 6]
Скрипты Inno Setup. Помощь и советы [часть 7]

Отправлено: 08:52, 02-02-2015

 

Аватара для kotyarko@fb

Старожил


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

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


habib2302, проблемного места, которое есть в первом прикреплённом вами скрипте, нет во втором (полном). Они отличаются.

-------
http://forum.worldoftanks.ru/topic/1429925-/
Исходник моего установщика: https://bitbucket.org/Kotyarko_O/kmp


Отправлено: 11:04, 09-10-2015 | #981



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для habib2302

Ветеран


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

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


kotyarko@fb, это понятно, что они отличаются. Вот ссылка на скрипт который был добавлен в первый прикрепленный скрипт https://yadi.sk/i/V_hiV_Sqjcvw5 и добавил реестр из пользовательского раздела sid

Последний раз редактировалось habib2302, 09-10-2015 в 12:17.


Отправлено: 12:11, 09-10-2015 | #982


Аватара для El Sanchez

Ветеран


Contributor


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

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


Цитата habib2302:
Помогите решить проблему »
habib2302, в справке написано, что функция, используемая в скриптовых code-константах должна иметь 1 параметр типа string и возвращать результат типа string или Boolean. Параметра нет - рассматриваем invalid prototype.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:53, 12-10-2015 | #983


Аватара для R.i.m.s.k.y.

Ветеран


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

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


господа состоятельные кроты
подскажите, пожалуйста, как сделать кнопку проверки установщика по чексумме
я в своих установщиках использую стандартные методы сжатия самим инно (bzip или 7zip)

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!


Отправлено: 15:11, 16-10-2015 | #984


Аватара для Stealthmax

Новый участник


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

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


Приветствую всех!
Подскажите решение с бэкапом ветки/веток реестра. Возможно ли добавить бэкап в {uninstallexe}, т.е. наподобие функции GetFromRes, но наоборот.
Дабы после установки содержимое бэкапа сохранилось в деинсталляторе для последующего восстановления при удалении.
Бэкап реестра
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[_code]
#define A = (Defined UNICODE) ? "W" : "A"
const
  SE_BACKUP_NAME = 'SeBackupPrivilege';
  SE_RESTORE_NAME = 'SeRestorePrivilege';

  TOKEN_QUERY = $8;
  TOKEN_ADJUST_PRIVILEGES = $20;
  SE_PRIVILEGE_ENABLED = $2;
  ERROR_SUCCESS = 0;
  KEY_WOW64_64KEY  =  $0100;
  MAXIMUM_ALLOWED = $02000000;
  REG_FORCE_RESTORE = $00000008;

type
  LUID = record
  LowPart: DWORD;
  HighPart: Longint;
  end;

  LUID_AND_ATTRIBUTES = record
  Luid: LUID;
  Attributes: DWORD;
  end;

  TOKEN_PRIVILEGES = record
  PrivilegeCount: DWORD;
  Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
  end;

  REGSAM = DWORD;
  HKEY = LongWord;

function RegSaveKey(hKey: HKEY; lpFile: String; lpSecurityAttributes: Longint):longint; external 'RegSaveKey{#A}@advapi32.dll stdcall';
function RegOpenKeyEx(hKey: HKEY; lpSubKey: String; ulOptions: DWORD; samDesired: REGSAM; var phkResult: HKEY): Longint; external 'RegOpenKeyEx{#A}@advapi32.dll stdcall';
function RegCreateKeyEx(hKey: HKEY; lpSubKey: String; Reserved: DWORD; lpClass: String; dwOptions: DWORD; samDesired: REGSAM; lpSecurityAttributes: Longint; var phkResult: HKEY; var lpdwDisposition: DWORD): Longint; external 'RegCreateKeyEx{#A}@advapi32.dll stdcall';
function RegCloseKey(hKey: HKEY): Longint; external 'RegCloseKey@advapi32.dll stdcall';
function RegRestoreKey(hKey: HKEY; lpFile: String; lpSecurityAttributes: Longint):longint; external 'RegRestoreKey{#A}@advapi32.dll stdcall';

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetLastError(): DWORD; external 'GetLastError@Kernel32 stdcall';
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean;
var
  hToken: THandle;
  TokenPriv: TOKEN_PRIVILEGES;
  PrevTokenPriv: TOKEN_PRIVILEGES;
  ReturnLength: Cardinal;
  Version: TWindowsVersion;
  ret: Longint;
begin
  GetWindowsVersionEx(Version);
  if not Version.NTPlatform then Exit;

  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
  begin
  try
  if LookupPrivilegeValue('', PAnsiChar(sPrivilege), TokenPriv.Privileges[0].Luid) then
  begin
  TokenPriv.PrivilegeCount := 1;

  case bEnabled of
  True: TokenPriv.Privileges[0].Attributes  := SE_PRIVILEGE_ENABLED;
  False: TokenPriv.Privileges[0].Attributes := 0;
  end;
  ReturnLength := 0;
  PrevTokenPriv := TokenPriv;

  AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv), PrevTokenPriv, ret);
  end;
  finally
  CloseHandle(hToken);
  end;
  end;
  Result := GetLastError = ERROR_SUCCESS;
  if not Result then MsgBox(SysErrorMessage(GetLastError), mbInformation, MB_OK);
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure RegBackupTofile(intKey: HKEY; intSubKey, outfile: string; Wow32: BOOL);  //Процедура бэкапа ветки реестра в файл
//intKey - корневой раздел
//intSubKey - Путь к ветке реестра
//outfile - Имя бэкапа
//Wow32 - если true то вкл перенаправление Wow3264Node
var
  phkResult: HKEY;
begin
if not NTSetPrivilege(SE_BACKUP_NAME, true) then if MsgBox('Ошибка прав доступа!', mbInformation, MB_OK) = IDOK then Exit;
  if Wow32 then begin
  if RegOpenKeyEx(intKey, intSubKey, 0, MAXIMUM_ALLOWED, phkResult) > ERROR_SUCCESS then begin MsgBox('Ошибка чтения реестра!', mbInformation, MB_OK); Exit; end;
  end else if RegOpenKeyEx(intKey, intSubKey, 0, MAXIMUM_ALLOWED or KEY_WOW64_64KEY, phkResult) > ERROR_SUCCESS then begin MsgBox('Ошибка чтения реестра!', mbInformation, MB_OK); Exit; end;
  if RegSaveKey(phkResult, outfile, 0) > ERROR_SUCCESS then begin MsgBox('Ошибка сохранения файла!', mbInformation, MB_OK); Exit; end;
RegCloseKey(phkResult);
end;

procedure RegRestorefromfile(outKey: HKEY; outSubKey, infile: string; Wow32: BOOL);  //Процедура востановление реестра из файла, параметры по аналогии
var
  phkResult: HKEY;
  lpdwDisposition: DWORD;
begin
  if not FileExists(infile) then begin MsgBox('Файл не найден!', mbInformation, MB_OK); Exit; end;
  NTSetPrivilege(SE_BACKUP_NAME, true);
  NTSetPrivilege(SE_RESTORE_NAME, true);
  if Wow32 then begin
  if RegCreateKeyEx(outKey, outSubKey, 0, '', 0, MAXIMUM_ALLOWED, 0, phkResult, lpdwDisposition) > ERROR_SUCCESS then begin MsgBox('Ошибка записи в реестр!', mbInformation, MB_OK); Exit; end;
  end else if RegCreateKeyEx(outKey, outSubKey, 0, '', 0, MAXIMUM_ALLOWED or KEY_WOW64_64KEY, 0, phkResult, lpdwDisposition) > ERROR_SUCCESS then begin MsgBox('Ошибка записи в реестр!', mbInformation, MB_OK); Exit; end;
  if RegRestoreKey(phkResult, infile, REG_FORCE_RESTORE) > ERROR_SUCCESS then begin MsgBox('Ошибка доступа к реестру!', mbInformation, MB_OK); Exit; end;
  RegCloseKey(phkResult);
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then begin
RegBackupTofile(HKEY_LOCAL_MACHINE, 'Software\2345Pic', ExpandConstant('{tmp}\RegBackup.dat'), true);
RegRestorefromfile(HKEY_LOCAL_MACHINE, 'Software\2345Pic_BackUp', ExpandConstant('{tmp}\RegBackup.dat'), true);
DeleteFile(ExpandConstant('{tmp}\RegBackup.dat')); end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then begin
RegBackupTofile(HKEY_LOCAL_MACHINE, 'Software\2345Pic_BackUp', ExpandConstant('{tmp}\RegBackup.dat'), true);
RegRestorefromfile(HKEY_LOCAL_MACHINE, 'Software\2345Pic', ExpandConstant('{tmp}\RegBackup.dat'), true);
DeleteFile(ExpandConstant('{tmp}\RegBackup.dat'));
RegDeleteKeyIncludingSubkeys(HKLM, 'Software\2345Pic_BackUp'); end;
end;

Мой вариант
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[_code]
#define A = (Defined UNICODE) ? "W" : "A"
const
  SE_BACKUP_NAME = 'SeBackupPrivilege';
  SE_RESTORE_NAME = 'SeRestorePrivilege';

  TOKEN_QUERY = $8;
  TOKEN_ADJUST_PRIVILEGES = $20;
  SE_PRIVILEGE_ENABLED = $2;
  ERROR_SUCCESS = 0;
  KEY_WOW64_64KEY  =  $0100;
  MAXIMUM_ALLOWED = $02000000;
  REG_FORCE_RESTORE = $00000008;

type
  LUID = record
  LowPart: DWORD;
  HighPart: Longint;
  end;

  LUID_AND_ATTRIBUTES = record
  Luid: LUID;
  Attributes: DWORD;
  end;

  TOKEN_PRIVILEGES = record
  PrivilegeCount: DWORD;
  Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
  end;

  REGSAM = DWORD;
  HKEY = LongWord;

function RegSaveKey(hKey: HKEY; lpFile: String; lpSecurityAttributes: Longint):longint; external 'RegSaveKey{#A}@advapi32.dll stdcall';
function RegOpenKeyEx(hKey: HKEY; lpSubKey: String; ulOptions: DWORD; samDesired: REGSAM; var phkResult: HKEY): Longint; external 'RegOpenKeyEx{#A}@advapi32.dll stdcall';
function RegCreateKeyEx(hKey: HKEY; lpSubKey: String; Reserved: DWORD; lpClass: String; dwOptions: DWORD; samDesired: REGSAM; lpSecurityAttributes: Longint; var phkResult: HKEY; var lpdwDisposition: DWORD): Longint; external 'RegCreateKeyEx{#A}@advapi32.dll stdcall';
function RegCloseKey(hKey: HKEY): Longint; external 'RegCloseKey@advapi32.dll stdcall';
function RegRestoreKey(hKey: HKEY; lpFile: String; lpSecurityAttributes: Longint):longint; external 'RegRestoreKey{#A}@advapi32.dll stdcall';

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetLastError(): DWORD; external 'GetLastError@Kernel32 stdcall';
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function NTSetPrivilege(sPrivilege: string; bEnabled: Boolean): Boolean;
var
  hToken: THandle;
  TokenPriv: TOKEN_PRIVILEGES;
  PrevTokenPriv: TOKEN_PRIVILEGES;
  ReturnLength: Cardinal;
  Version: TWindowsVersion;
  ret: Longint;
begin
  GetWindowsVersionEx(Version);
  if not Version.NTPlatform then Exit;

  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
  begin
  try
  if LookupPrivilegeValue('', PAnsiChar(sPrivilege), TokenPriv.Privileges[0].Luid) then
  begin
  TokenPriv.PrivilegeCount := 1;

  case bEnabled of
  True: TokenPriv.Privileges[0].Attributes  := SE_PRIVILEGE_ENABLED;
  False: TokenPriv.Privileges[0].Attributes := 0;
  end;
  ReturnLength := 0;
  PrevTokenPriv := TokenPriv;

  AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(PrevTokenPriv), PrevTokenPriv, ret);
  end;
  finally
  CloseHandle(hToken);
  end;
  end;
  Result := GetLastError = ERROR_SUCCESS;
  if not Result then MsgBox(SysErrorMessage(GetLastError), mbInformation, MB_OK);
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure RegBackupTofile(intKey: HKEY; intSubKey, outfile: string; Wow32: BOOL);  //Процедура бэкапа ветки реестра в файл
//intKey - корневой раздел
//intSubKey - Путь к ветке реестра
//outfile - Имя бэкапа
//Wow32 - если true то вкл перенаправление Wow3264Node
var
  phkResult: HKEY;
begin
if not NTSetPrivilege(SE_BACKUP_NAME, true) then if MsgBox('Ошибка прав доступа!', mbInformation, MB_OK) = IDOK then Exit;
  if Wow32 then begin
  if RegOpenKeyEx(intKey, intSubKey, 0, MAXIMUM_ALLOWED, phkResult) > ERROR_SUCCESS then begin MsgBox('Ошибка чтения реестра!', mbInformation, MB_OK); Exit; end;
  end else if RegOpenKeyEx(intKey, intSubKey, 0, MAXIMUM_ALLOWED or KEY_WOW64_64KEY, phkResult) > ERROR_SUCCESS then begin MsgBox('Ошибка чтения реестра!', mbInformation, MB_OK); Exit; end;
  if RegSaveKey(phkResult, outfile, 0) > ERROR_SUCCESS then begin MsgBox('Ошибка сохранения файла!', mbInformation, MB_OK); Exit; end;
RegCloseKey(phkResult);
end;

procedure RegRestorefromfile(outKey: HKEY; outSubKey, infile: string; Wow32: BOOL);  //Процедура востановление реестра из файла, параметры по аналогии
var
  phkResult: HKEY;
  lpdwDisposition: DWORD;
begin
  if not FileExists(infile) then begin MsgBox('Файл не найден!', mbInformation, MB_OK); Exit; end;
  NTSetPrivilege(SE_BACKUP_NAME, true);
  NTSetPrivilege(SE_RESTORE_NAME, true);
  if Wow32 then begin
  if RegCreateKeyEx(outKey, outSubKey, 0, '', 0, MAXIMUM_ALLOWED, 0, phkResult, lpdwDisposition) > ERROR_SUCCESS then begin MsgBox('Ошибка записи в реестр!', mbInformation, MB_OK); Exit; end;
  end else if RegCreateKeyEx(outKey, outSubKey, 0, '', 0, MAXIMUM_ALLOWED or KEY_WOW64_64KEY, 0, phkResult, lpdwDisposition) > ERROR_SUCCESS then begin MsgBox('Ошибка записи в реестр!', mbInformation, MB_OK); Exit; end;
  if RegRestoreKey(phkResult, infile, REG_FORCE_RESTORE) > ERROR_SUCCESS then begin MsgBox('Ошибка доступа к реестру!', mbInformation, MB_OK); Exit; end;
  RegCloseKey(phkResult);
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// мой вариант
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then 
  begin //бэкап непосредственно перед установкой
    RegBackupTofile(HKEY_LOCAL_MACHINE, 'SOFTWARE\2345Pic', ExpandConstant('{app}\RegBackup.dat'), true); //сохраняем ключ 1
    RegBackupTofile(HKEY_LOCAL_MACHINE, 'SOFTWARE\Google', ExpandConstant('{app}\RegBackup_1.dat'), true); //сохраняем ключ 2
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then 
  begin
   RegRestorefromfile(HKEY_LOCAL_MACHINE, 'Software\2345Pic', ExpandConstant('{app}\RegBackup.dat'), true); //восстанавливаем ключ 1
   RegRestorefromfile(HKEY_LOCAL_MACHINE, 'Software\Google', ExpandConstant('{app}\RegBackup_1.dat'), true); //восстанавливаем ключ 2
   DeleteFile(ExpandConstant('{app}\RegBackup.dat'));
   DeleteFile(ExpandConstant('{app}\RegBackup_1.dat'));
  end;
end;

Восстановить из файла RegBackup.dat и RegBackup_1.dat ничто не мешает, но хотелось бы некой эстетики и не плодить множество файлов *.dat.

Цитата R.i.m.s.k.y.:
сделать кнопку проверки установщика по чексумме »
Т.е. зашифровать на основе MD5? Защита от распаковки?

Отправлено: 22:31, 16-10-2015 | #985


Аватара для nik1967

Старожил


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

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


R.i.m.s.k.y., ISMD5.

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:45, 17-10-2015 | #986


Аватара для Stealthmax

Новый участник


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

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


Тут как-то поднимали вопрос по поводу ключей командной строки, т.е. сделать их менее подробными и компактными.
Измененные ключи

/SILENT- /NS
/VERYSILENT- /S
/NOICONS- /NI
/DIR- /D
/SUPPRESSMSGBOXES- /SMB
/NOCANCEL- /NC
/NORESTART- /NR
/RESTARTEXITCODE- /REC
/NOCLOSEAPPLICATIONS- /NCA
/LANG- /L
/GROUP- /G
/TASKS- /T
/TYPE- /TP
/MERGETASKS- /MT
/PASSWORD- /PASS
/NORESTARTAPPLICATIONS- /NRA
/COMPONENTS- /C


Также убрана приставка _is1 при создании ключа деинсталляции в реестре.
Выкладываю 3 версии для Restools 5.5.1.ee2(u) (build 121216). Скопировать с заменой в папку, не забывайте про бэкап.
Setup.e32<-- без изменений деинсталлятора, т.е. имеет вид unins000.exe(стабильный вариант)
Setup.e32(with _is1)<-- без изменений деинсталлятора, возвращена приставка _is1
Setup.e32_(uninstall) <-- в этой версии деинсталлятор имеет вид uninstall.exe, но есть баг, при установке поверх выдает ошибку и откатывает установку.

Последний раз редактировалось Stealthmax, 20-10-2015 в 04:44.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:00, 17-10-2015 | #987


Аватара для El Sanchez

Ветеран


Contributor


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

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


Цитата Stealthmax:
Возможно ли добавить бэкап в {uninstallexe} »
Stealthmax, через правку исходников, GetPreviousData/SetPreviousData, ADS.
Цитата Stealthmax:
Тут как-то поднимали вопрос по поводу ключей командной строки, т.е. сделать их менее подробными и компактными. »
Stealthmax, и пытаться потом вспоминать значения этих параметров, рассматривая аббревиатуры до посинения? Длинный параметр есть слово/словосочетание английского языка, по значению которого можно понять чего параметр делает.
Цитата Stealthmax:
Также убрана приставка _is1 при создании ключа деинсталляции в реестре. »
Stealthmax, программа установлена, хочу поставить вторую копию в другую папку, установщик перепишет новыми данными раздел без приставки, вместо того, чтобы прописаться в _is2.
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:38, 18-10-2015 | #988


Новый участник


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

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


Всем привет. Делаю сборку CS:S nosteam. Гуглил на просторах интернета скрипт, который сможет изменять ник и клан тэг в файле rev.ini. Нашёл, пришлось, правда, доделать ввод клантэга. Проблема в следующем: как заставить установщик по дефолту сохранять клантэг и ник в UTF-8 и убрать чекбокс "сохранить в UTF-8". Может кто подсказать решение проблемы? Скрипт прилагаю ниже. Заранее спасибо!

Код: Выделить весь код
#ifndef UNICODE
    #error Unicode version of Inno Setup is required to compile this script
#endif

var
  RevEmuPage: TInputQueryWizardPage;
  ConvertCheckBox: TCheckBox;

procedure SetNickname(Nickname: String; Filename: String; IsConvert: Boolean);
var
    arrAnsi, arrUtf8: TArrayOfString;
    i: Integer;
begin
    if IsConvert then
    begin
        LoadStringsFromFile(Filename, arrAnsi);
        SetArrayLength(arrUtf8, 1);
        for i := 0 to GetArrayLength(arrAnsi)-1 do
        begin
            if Pos(LowerCase('PlayerName='), LowerCase(arrAnsi[i])) = 0 then
                SaveStringToFile(Filename, arrAnsi[i] + #13#10, i <> 0)
            else begin
                arrUtf8[0] := Copy(arrAnsi[i], 0, Length('PlayerName=')) + Nickname + #10;
                SaveStringsToUTF8File(Filename, arrUtf8, i <> 0);
            end;
        end;
    end else SetIniString('steamclient', 'PlayerName', Nickname, Filename);
end;

procedure SetClantag(Clantag: String; Filename: String; IsConvert: Boolean);
var
    arrAnsi, arrUtf8: TArrayOfString;
    i: Integer;
begin
    if IsConvert then
    begin
        LoadStringsFromFile(Filename, arrAnsi);
        SetArrayLength(arrUtf8, 1);
        for i := 0 to GetArrayLength(arrAnsi)-1 do
        begin
            if Pos(LowerCase('Clantag='), LowerCase(arrAnsi[i])) = 0 then
                SaveStringToFile(Filename, arrAnsi[i] + #13#10, i <> 0)
            else begin
                arrUtf8[0] := Copy(arrAnsi[i], 0, Length('Clantag=')) + Clantag + #10;
                SaveStringsToUTF8File(Filename, arrUtf8, i <> 0);
            end;
        end;
    end else SetIniString('steamclient', 'Clantag', Clantag, Filename);
end;

procedure NicknameOnChange (Sender: TObject);
begin
    WizardForm.NextButton.Enabled := RevEmuPage.Values[0] <> '';
end;

procedure InitializeWizard();
begin
    RedesignWizardForm;

    RevEmuPage := CreateInputQueryPage(wpInfoAfter, 'Игровая информация', '', 'Пожалуйста, введите введите свой ник и Clan-tag и нажмите Далее.');
    with RevEmuPage do
    begin
        Add('Ник:', False);
        Edits[0].OnChange := @NicknameOnChange;
        Add('Клан-тэг:', False);
    end;
    ConvertCheckBox := TCheckBox.Create(WizardForm);
    with ConvertCheckBox do
    begin
        Parent := RevEmuPage.Surface;
        SetBounds(RevEmuPage.Edits[0].Left, RevEmuPage.Edits[0].Top + ScaleY(100), ScaleX(200), ScaleY(17));
        Caption := 'Сохранить в UTF-8';
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
    if CurPageID = RevEmuPage.ID then WizardForm.NextButton.Enabled := RevEmuPage.Values[0] <> '';
    if CurPageID = wpFinished then SetNickname(RevEmuPage.Values[0], ExpandConstant('{app}\rev.ini'), ConvertCheckBox.Checked);
    if CurPageID = wpFinished then SetClantag(RevEmuPage.Values[0], ExpandConstant('{app}\rev.ini'), ConvertCheckBox.Checked);
end;

Отправлено: 14:25, 18-10-2015 | #989


Аватара для Stealthmax

Новый участник


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

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


Цитата El Sanchez:
программа установлена, хочу поставить вторую копию в другую папку, установщик перепишет новыми данными раздел без приставки, вместо того, чтобы прописаться в _is2 »
Учту и верну данный параметр.
Цитата El Sanchez:
Длинный параметр есть слово/словосочетание английского языка, по значению которого можно понять чего параметр делает »
Ну исходил как раз из того, чтоб 2-3 буквы было, не от "фонаря" само собой. /SILENT и /VERYSILENT, на мой взгляд, было извращением, как и прочие ключи вида "/XXXXXXXXXXXXXXX". Большинство разработчиков используют краткость для ключей командной строки, прикрепляя справку. А в целом, эти изменения рассчитаны на узкий круг пользователей.
Цитата El Sanchez:
через правку исходников, GetPreviousData/SetPreviousData, ADS. »
А можно наглядный пример?

Последний раз редактировалось Stealthmax, 18-10-2015 в 22:30.


Отправлено: 20:37, 18-10-2015 | #990



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 8]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 7] El Sanchez Автоматическая установка приложений 2499 02-02-2015 08:59
Скрипты Inno Setup. Помощь и советы [часть 6] El Sanchez Автоматическая установка приложений 2494 10-03-2014 11:51
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58




 
Переход