Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 8]
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? Защита от распаковки?
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_]
Заранее спасибо.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.