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

Ответить
 • Просмотры: 43
Аватара пользователя
audiofeel

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

Сообщение audiofeel »

поменял координаты почти всего в procedure InitializeWizard

добавил стекло ISWIN7, окно черное, только кнопки на стекле, подскажите что добавить или указать правильно

вот пример мой небольшой

Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

procedure InitializeWizard;
begin
  with WizardForm do begin
  ClientWidth := ScaleX(529);
  ClientHeight := ScaleY(350);
  InnerNotebook.Hide;
  OuterNotebook.Hide;
  Bevel.Hide;
  Position := poDesktopCenter;
  WizardBitMapImage.Parent := WizardForm;
  WizardBitMapImage.SetBounds(ScaleX(6), ScaleY(6), ScaleX(518), ScaleY(191));
  NextButton.SetBounds(ScaleX(349), ScaleY(316), ScaleX(80), ScaleY(23));
  BackButton.SetBounds(ScaleX(269), ScaleY(316), ScaleX(80), ScaleY(23));
  CancelButton.SetBounds(ScaleX(438), ScaleY(316), ScaleX(80), ScaleY(23));
  DirBrowseButton.Parent := WizardForm;
  DirBrowseButton.SetBounds(ScaleX(428), ScaleY(244), ScaleX(80), ScaleY(23));
  DirEdit.Parent := WizardForm;
  DirEdit.SetBounds(ScaleX(22), ScaleY(245), ScaleX(390), ScaleY(21));
  DiskSpaceLabel.Parent := WizardForm;
  DiskSpaceLabel.SetBounds(ScaleX(20), ScaleY(279), ScaleX(450), ScaleY(16));
  GroupBrowseButton.Parent := WizardForm;
  GroupBrowseButton.SetBounds(ScaleX(428), ScaleY(244), ScaleX(80), ScaleY(23));
  GroupEdit.Parent := WizardForm;
  GroupEdit.SetBounds(ScaleX(22), ScaleY(245), ScaleX(390), ScaleY(21));
  NoIconsCheck.Parent := WizardForm
  NoIconsCheck.SetBounds(ScaleX(23), ScaleY(276), ScaleX(417), ScaleY(17));
  TasksList.Parent := WizardForm;
  TasksList.SetBounds(ScaleX(19), ScaleY(207), ScaleX(504), ScaleY(90));
  ReadyMemo.Parent := WizardForm;
  ReadyMemo.SetBounds(ScaleX(23), ScaleY(220), ScaleX(484), ScaleY(82));
  FilenameLabel.Parent := WizardForm;
  FilenameLabel.SetBounds(ScaleX(20), ScaleY(225), ScaleX(485), ScaleY(17));
  StatusLabel.Parent := WizardForm;
  StatusLabel.SetBounds(ScaleX(20), ScaleY(211), ScaleX(485), ScaleY(17));
  end;
  CreateControls;
end;
Аватара пользователя
audiofeel

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

Сообщение audiofeel »

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

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

Сообщение vadjliss »

Цитата habib2302:



Помогите решить проблему
Скрипты Inno Setup. Помощь и советы [часть 8]




habib2302, в справке написано, что функция, используемая в скриптовых code-константах должна иметь 1 параметр типа string и возвращать результат типа string или Boolean. Параметра нет - рассматриваем invalid prototype.
Аватара пользователя
vadjliss

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

Сообщение vadjliss »

audiofeel, Комплект, упаковщики - распаковщики.

http://rghost.ru/85k69DsmC
Аватара пользователя
vadjliss

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

Сообщение vadjliss »

Приветствую всех!

Подскажите решение с бэкапом ветки/веток реестра. Возможно ли добавить бэкап в {uninstallexe}, т.е. наподобие функции GetFromRes, но наоборот.

Дабы после установки содержимое бэкапа сохранилось в деинсталляторе для последующего восстановления при удалении.


Бэкап реестра

[spoiler]Код:
[/spoiler]

Код: Выделить всё

[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;









Мой вариант

[spoiler]Код:
[/spoiler]

Код: Выделить всё

[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.:



сделать кнопку проверки установщика по чексумме
Скрипты Inno Setup. Помощь и советы [часть 8]




Т.е. зашифровать на основе MD5? Защита от распаковки?
Аватара пользователя
Sobol37

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

Сообщение Sobol37 »

Чем правильно заменить выделенную область что бы вносились данные в реестр под любым SID и на любом компьютере:



Root: HKU; SubKey: S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXX\Software
Аватара пользователя
Sobol37

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

Сообщение Sobol37 »

Цитата Stealthmax:



Возможно ли добавить бэкап в {uninstallexe}
Скрипты Inno Setup. Помощь и советы [часть 8]




Stealthmax, через правку исходников,
GetPreviousData
/
SetPreviousData
,
ADS
.


Цитата Stealthmax:



Тут как-то поднимали вопрос по поводу ключей командной строки, т.е. сделать их менее подробными и компактными.
Скрипты Inno Setup. Помощь и советы [часть 8]




Stealthmax, и пытаться потом вспоминать значения этих параметров, рассматривая аббревиатуры до посинения? Длинный параметр есть слово/словосочетание английского языка, по значению которого можно понять чего параметр делает.


Цитата Stealthmax:



Также убрана приставка _is1 при создании ключа деинсталляции в реестре.
Скрипты Inno Setup. Помощь и советы [часть 8]




Stealthmax, программа установлена, хочу поставить вторую копию в другую папку, установщик перепишет новыми данными раздел без приставки, вместо того, чтобы прописаться в _is2.
Аватара пользователя
habib2302

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

Сообщение habib2302 »

Всем привет. Делаю сборку 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;
Аватара пользователя
habib2302

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

Сообщение habib2302 »

Цитата El Sanchez:



программа установлена, хочу поставить вторую копию в другую папку, установщик перепишет новыми данными раздел без приставки, вместо того, чтобы прописаться в _is2
Скрипты Inno Setup. Помощь и советы [часть 8]




Учту и верну данный параметр.


Цитата El Sanchez:



Длинный параметр есть слово/словосочетание английского языка, по значению которого можно понять чего параметр делает
Скрипты Inno Setup. Помощь и советы [часть 8]




Ну исходил как раз из того, чтоб 2-3 буквы было, не от "фонаря" само собой. /SILENT и /VERYSILENT, на мой взгляд, было извращением, как и прочие ключи вида "/XXXXXXXXXXXXXXX". Большинство разработчиков используют краткость для ключей командной строки, прикрепляя справку. А в целом, эти изменения рассчитаны на узкий круг пользователей.


Цитата El Sanchez:



через правку исходников, GetPreviousData/SetPreviousData, ADS.
Скрипты Inno Setup. Помощь и советы [часть 8]




А можно наглядный пример?
Ответить

Вернуться в «Автоматическая установка приложений»