PDA

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


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 [50] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

kotyarko@fb
09-10-2015, 11:04
habib2302, проблемного места, которое есть в первом прикреплённом вами скрипте, нет во втором (полном). Они отличаются.

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

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

R.i.m.s.k.y.
16-10-2015, 15:11
господа состоятельные кроты
подскажите, пожалуйста, как сделать кнопку проверки установщика по чексумме
я в своих установщиках использую стандартные методы сжатия самим инно (bzip или 7zip)

Stealthmax
16-10-2015, 22:31
Приветствую всех!
Подскажите решение с бэкапом ветки/веток реестра. Возможно ли добавить бэкап в {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.

сделать кнопку проверки установщика по чексумме »
Т.е. зашифровать на основе MD5? Защита от распаковки?

nik1967
17-10-2015, 07:45
R.i.m.s.k.y., ISMD5 (http://krinkels.org/threads/ismd5.1943/).

Stealthmax
17-10-2015, 23:00
Тут как-то поднимали вопрос по поводу ключей командной строки, т.е. сделать их менее подробными и компактными.

/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 (https://mega.nz/#!nFggzA6R!doAB3s_mGHMv5UeijPhNwOFJDF877UjmMeTETNsOoh8)<-- без изменений деинсталлятора, т.е. имеет вид unins000.exe(стабильный вариант)
Setup.e32(with _is1) (https://mega.nz/#!PRo3HCDC!WPLFb704XK-fBMh33fqeIyt6FqCu8l5h8-IiwR_B4Wc)<-- без изменений деинсталлятора, возвращена приставка _is1
Setup.e32_(uninstall) (https://mega.nz/#!nABCBZgb!3oc8lCqoqP1xhgBPud6GRhp9yRanX1V0fFGmC87lyWI) <-- в этой версии деинсталлятор имеет вид uninstall.exe, но есть баг, при установке поверх выдает ошибку и откатывает установку.

El Sanchez
18-10-2015, 10:38
Возможно ли добавить бэкап в {uninstallexe} »
Stealthmax, через правку исходников, GetPreviousData (http://www.jrsoftware.org/ishelp/topic_isxfunc_getpreviousdata.htm)/SetPreviousData (http://www.jrsoftware.org/ishelp/topic_isxfunc_setpreviousdata.htm), ADS (https://msdn.microsoft.com/en-us/library/windows/desktop/aa364404%28v=vs.85%29.aspx).
Тут как-то поднимали вопрос по поводу ключей командной строки, т.е. сделать их менее подробными и компактными. »
Stealthmax, и пытаться потом вспоминать значения этих параметров, рассматривая аббревиатуры до посинения? Длинный параметр есть слово/словосочетание английского языка, по значению которого можно понять чего параметр делает.
Также убрана приставка _is1 при создании ключа деинсталляции в реестре. »
Stealthmax, программа установлена, хочу поставить вторую копию в другую папку, установщик перепишет новыми данными раздел без приставки, вместо того, чтобы прописаться в _is2.

Batistas
18-10-2015, 14:25
Всем привет. Делаю сборку 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;

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

El Sanchez
19-10-2015, 16:35
А можно наглядный пример? »
Stealthmax, исходники в свободном доступе, разработчик заложил возможность добавления пользовательских данных в деинсталлятор. GetPreviousData/SetPreviousData для записи/чтения пользовательских данных (строковых) в реестре в разделе регистрации установщика, сериализировать данные в строку и SetPreviousData в RegisterPreviousData, см. справку. ADS (альтернативные потоки данных) будут работать только на NTFS. Пример:

var
Value: AnsiString;

...

// запись
SaveStringToFile(ExpandConstant('{src}\test.txt:MyStream'), 'Text in MyStream', False);

// чтение
LoadStringFromFile(ExpandConstant('{src}\test.txt:MyStream'), Value);


Я бы оставил как есть (запись бекапа во отдельный файл) или способ с GetPreviousData/SetPreviousData.
как заставить установщик по дефолту сохранять клантэг и ник в UTF-8 и убрать чекбокс "сохранить в UTF-8" »
Batistas, узнаю свой г-код, сейчас бы я так написал:

[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
DirExistsWarning=no
Uninstallable=no
CreateUninstallRegKey=no

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[Code]
#ifndef UNICODE
#error Unicode version of Inno Setup is required to compile this script
#endif
const
CP_UTF8 = 65001;

function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: Integer; lpMultiByteStr: AnsiString; cbMultiByte, lpDefaultChar: Integer; lpUsedDefaultChar: Longint): Integer; external 'WideCharToMultiByte@kernel32.dll stdcall';

var
RevEmuPage: TInputQueryWizardPage;

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

///////////////////////////
procedure InitializeWizard;
begin
RevEmuPage := CreateInputQueryPage(wpInfoAfter, 'Игровая информация', '', 'Пожалуйста, введите введите свой ник и Clan-tag и нажмите Далее.');
with RevEmuPage do
begin
Add('Ник:', False);
Add('Клан-тэг:', False);
Edits[0].OnChange := @RevEmuPageEditsOnChange;
end;
end;

/////////////////////////////////////////////////////
function UTF8Encode(const Value: string): AnsiString;
var
Len: Integer;
begin
if Value = '' then Exit;
Len := WideCharToMultiByte(CP_UTF8, 0, Value, -1, '', 0, 0, 0);
if Len = 0 then Exit;
Result := StringOfChar(#0, Len - 1);
if WideCharToMultiByte(CP_UTF8, 0, Value, -1, Result, Len, 0, 0) = 0 then Exit;
end;

/////////////////////////////////////////////
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
RevEmuPage.ID:
WizardForm.NextButton.Enabled := (RevEmuPage.Values[0] <> '');
wpFinished:
begin
SetIniString('steamclient', 'PlayerName', UTF8Encode(RevEmuPage.Values[0]), ExpandConstant('{app}\rev.ini'));
SetIniString('steamclient', 'ClanTag', UTF8Encode(RevEmuPage.Values[1]), ExpandConstant('{app}\rev.ini'));
end;
end;
end;

Stealthmax
19-10-2015, 16:52
Я бы оставил как есть (запись бекапа во отдельный файл) »
Способ неплохой за исключением одного момента: нельзя суммировать в один файл бэкапа несколько веток, а так бы уже, пусть лежал в папке, жить не машет точно.

Batistas
20-10-2015, 09:49
Batistas, узнаю свой г-код, сейчас бы я так написал:
Скрытый текст »

Да, это именно Ваш код. Спасибо большое за помощь!

palsn2000
20-10-2015, 18:23
Доброго всем времени. Подскажите пожалуйста как добавить информацию из рег файла через секцию [_Run_] в скрытом режиме и без вопросов о добавлении из небезопасного источника.

Сразу оговорюсь, что секция реестра инно не подходит, так как цель моя заключается в следующем:
Делаю сборку программ (одной из которых является Notepad++) так вот этот Notepad++ интегрируется в проводник при помощи регистрируемой библиотеки, которая сама генерирует строку в реестре Edit with &Notepad++ и заменяет то, что пишет инно из секции реестра.
Вот я и хочу, добавить данные (заменить Edit with на Открыть с помощью) на этапе postinstall. или подскажите пожалуйста как это реализовать через секцию [_Code_]
Заранее спасибо.

TryRooM
21-10-2015, 02:10
palsn2000, Пробуйте.

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then begin
if IsWin64 then
RegWriteStringValue(HKLM64, 'SOFTWARE\Classes\CLSID\{B298D29A-A6ED-11DE-BA8C-A68E55D89593}\Settings', 'Title', 'Открыть с помощью Notepad++')
end else begin
RegWriteStringValue(HKLM, 'SOFTWARE\Classes\CLSID\{B298D29A-A6ED-11DE-BA8C-A68E55D89593}\Settings', 'Title', 'Открыть с помощью Notepad++')
end;
end;

kalyanbi4
22-10-2015, 16:35
Всем добрый день!
Подскажите пожалуйста - создаю дистрибутив - устанавливаю его. После установки в меню "Пуск" не появляется пункт с установленным ПО, а появится он только после установки другого дистрибутива или после перезагрузки ПК.
С чем может быть связано?

Painkiller
23-10-2015, 14:10
Народ, тупой вопрос , в какой переменной находиться путь к %userprofile%?

El Sanchez
23-10-2015, 14:29
Народ, тупой вопрос , в какой переменной находиться путь к %userprofile%? »
Painkiller, например, в {%USERPROFILE}

Painkiller
23-10-2015, 14:38
Painkiller, например, в {%USERPROFILE} »
Пробовал, получаю путь C:\Users\Mazahaka_lab\AppData\Roaming\uTorrent, а мне надо C:\Users\Mazahaka_lab\uTorrent

Dodakaedr
23-10-2015, 14:40
Painkiller, Если так показать, разберетесь?[setup]
appname=app
appvername=1.0
createappdir=no

[code]
const
CSIDL_PROFILE = $28;

procedure InitializeWizard();
var
s: string;
begin
s := GetShellFolderByCSIDL(CSIDL_PROFILE, false);
WizardForm.WelcomeLabel1.Caption := s+'\uTorrent';
end;




© OSzone.net 2001-2012