Ветеран
Сообщения: 862
Благодарности: 102
|
Профиль
|
Отправить PM
| Цитировать
ZVSRus, Посмотрите, правильно ли сделал?
Скрытый текст
Код: 
#define AppName "Axialis IconWorkshop"
#define AppVersion "6.9.1"
#include "include\botva2.iss"
[Setup]
AppName={#AppName}
AppVerName={#AppName} {#AppVersion}
AppId={#AppName}
AppVersion={#AppVersion}
AppCopyright=Xabib © 2020
AppPublisher=Axialis Software
AllowNoIcons=yes
DefaultDirName={code:GetDefaultDirName}\{#AppName}
DefaultGroupName={#AppName}
DisableWelcomePage=yes
DisableReadyPage=yes
DisableFinishedPage=yes
DirExistsWarning=no
PrivilegesRequiredOverridesAllowed=dialog
SetupIconFile=Install.ico
UninstallDisplayIcon={app}\IconWorkshop.exe
UninstallDisplayName={#AppName} {#AppVersion}
OutputBaseFilename={#AppName} {#AppVersion} RePack (& Portable) by Xabib
VersionInfoDescription={#AppName} RePack by Xabib
VersionInfoVersion={#AppVersion}
Compression=lzma2/ultra64
SolidCompression=true
InternalCompressLevel=ultra64
LZMADictionarySize=65536
LZMAMatchFinder=BT
LZMANumFastBytes=273
Uninstallable=not IsInPortableMode
UsePreviousAppDir=no
CreateUninstallRegKey=not IsInPortableMode
RawDataResource=Botva>botva2.dll,WMSI>WMSI.png
[Languages]
Name: enu; MessagesFile: compiler:default.isl
Name: rus; MessagesFile: compiler:Languages\russian.isl
[Messages]
BeveledLabel=RePack by Xabib
SelectLanguageTitle={#AppName}
[CustomMessages]
enu.CreateConfigShowOptions=Show options window (when finishing install)
enu.CreateDefaultConfig=Create default configuration
enu.ForbiddenDirMessage=In portable mode, %1 should not be installed in "Program Files" or similar system directories.
enu.InstallModePageCaption=Pick Installation Mode
enu.InstallModePageDescription=Do you prefer integration into Windows or a portable installation?
enu.InstallModePageNormalOption=Normal - Integrates into Windows
enu.InstallModePagePortableOption=Portable - Supports removeable drives (e.g., USB pen drives)
enu.InstallModePageSubCaption=Choose a normal installation that integrates into Windows (e.g., Startmenu, optional Explorer context menu), or a portable installation that can run on any compatible Windows machine.
enu.LanguageFilesComponent=Languages
enu.OpenInstallFolderAfterInstall=Open installation target folder
enu.ProgramFilesComponent=Program Files
enu.StatusRunHxDToCreateConfigFile=Create configuration file...
enu.TaskConfigurationFile=Configuration file:
enu.WriteProtectConfig=Make readonly
enu.PortableButtonInstall=&Unpack
rus.CreateConfigShowOptions=Показать окно параметров (после завершения установки)
rus.CreateDefaultConfig=Создать конфигурацию по умолчанию
rus.ForbiddenDirMessage=В портативном режиме %1 не следует устанавливать в «Program Files» или аналогичных системных каталогах.
rus.InstallModePageCaption=Выберите тип установки
rus.InstallModePageDescription=Предпочитаете интеграцию в Windows или портативную версию?
rus.InstallModePageNormalOption=Нормальная - интеграция в Windows
rus.InstallModePagePortableOption=Портативная - поддерживает переносимые устройства (USB/HDD)
rus.InstallModePageSubCaption=Выберите нормальный тип для установки программы в Windows (добавление в меню Пуск, опционально в контекстное меню) или портативную для работы программы на любом ПК, совместимым с Windows
rus.LanguageFilesComponent=Языки
rus.OpenInstallFolderAfterInstall=Открыть папку установки
rus.ProgramFilesComponent=Program Files
rus.StatusRunHxDToCreateConfigFile=Создать файл конфигурации...
rus.TaskConfigurationFile=Файл конфигурации:
rus.WriteProtectConfig=Сделать доступным только для чтения
rus.PortableButtonInstall=&Распаковать
[Files]
Source: "{app}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{userdocs}\*"; DestDir: "{userdocs}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{userappdata}\*"; DestDir: "{userappdata}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsInPortableMode;
Source: "{app}\*"; DestDir: "{app}\App\IconWorkshop"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "{userdocs}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "{userappdata}\*"; DestDir: "{app}\App\DefaultData"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsInPortableMode;
Source: "IconWorkshopPortable.exe"; DestDir: "{app}"; Flags: ignoreversion; Check: IsInPortableMode;
Source: "IconWorkshop_RUS.reg"; DestDir: "{app}\Data"; DestName: "IconWorkshop.reg"; Flags: ignoreversion; Languages: rus; Check: IsInPortableMode;
Source: "IconWorkshop_ENG.reg"; DestDir: "{app}\Data"; DestName: "IconWorkshop.reg"; Flags: ignoreversion; Languages: enu; Check: IsInPortableMode;
#include "include\Registry.iss"
[Run]
Filename: netsh.exe; Parameters: "advfirewall firewall add rule name=""{#AppName}"" dir=in action=block program=""{app}\IconWorkshop.exe"" enable=yes"; Check: not IsInPortableMode; Flags: runhidden;
Filename: netsh.exe; Parameters: "advfirewall firewall add rule name=""{#AppName}"" dir=out action=block program=""{app}\IconWorkshop.exe"" enable=yes"; Check: not IsInPortableMode; Flags: runhidden;
[Icons]
Name: {group}\{#AppName}; Filename: {app}\IconWorkshop.exe; Check: not IsInPortableMode;
Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe}; Check: not IsInPortableMode;
Name: {autodesktop}\{#AppName}; Filename: {app}\IconWorkshop.exe; Tasks: desktopicon; Check: not IsInPortableMode;
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Check: not IsInPortableMode;
[UninstallRun]
Filename: taskkill; Parameters: "/f /im IconWorkshop.exe"; Flags: RunHidden;
Filename: netsh.exe; Parameters: "advfirewall firewall delete rule name=""{#AppName}"""; Check: not IsInPortableMode; Flags: runhidden;
#include "include\UninstallDelete.iss"
[INI]
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "0"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Deleted Items\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Deleted Items\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Deleted Items\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "1"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Icons\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Icons\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Icons\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "6"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Media Files\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Media Files\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Media Files\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "12"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Media Files\Images\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "8"; Check: not IsInPortableMode;
; Imported INI File: "C:\Users\Admin\Documents\Axialis Librarian\Objects\desktop.ini"
Filename: "{userdocs}\Axialis Librarian\Objects\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconFile"; String: "{app}\axlibico.dll"; Check: not IsInPortableMode;
Filename: "{userdocs}\Axialis Librarian\Objects\desktop.ini"; Section: ".ShellClassInfo"; Key: "IconIndex"; String: "14"; Check: not IsInPortableMode;
[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
RT_RCDATA = 10;
var
InputOptionPage: TInputOptionWizardPage;
lResStream: TResourceStream;
lPicHandle: THandle;
i: integer;
Install: TNewRadioButton;
Portable: TNewRadioButton;
PortablePanel: TPanel;
InstallerPanel: TPanel;
function CheckParam(s: string): boolean;
begin
for i := 0 to ParamCount do
begin
Result := ParamStr(i) = s;
if Result then Break;
end;
end;
function GetInstallDir(S: String): String;
begin
if CheckParam('/P') then
Result:= ExpandConstant('{userdesktop}\{#AppName}')
else
Result:= ExpandConstant(S);
end;
function InstallCheck: Boolean;
begin
Result := Install.Checked or CheckParam('/I');
end;
function IsInPortableMode: Boolean;
begin
Result := InputOptionPage.Values[1] and CheckParam('/P');
end;
function GetDefaultDirName(const AParam: string): string;
begin
if ExpandConstant('{param:portable|0}') = '1' then
Result := ExpandConstant('{userdesktop}') else
Result := ExpandConstant('{autopf}');
end;
//Запрет распаковки в системные папки-----Start-----
function IsForbiddenDir(const ADir: string): Boolean;
begin
Result := IsAdminInstallMode and
((not IsWin64 and (Pos(ExpandConstant('{win}'), ADir) = 1)) or
(not IsWin64 and (Pos(ExpandConstant('{commonpf32}'), ADir) = 1)) or
(IsWin64 and (Pos(ExpandConstant('{commonpf64}'), ADir) = 1)));
end;
//Запрет распаковки в системные папки-----Finish-----
//Замена пути распаковки в зависимости от типа-----Start-----
procedure InstallModeListBoxClick(Sender: TObject);
begin
if IsInPortableMode and (CompareText(WizardDirValue, ExpandConstant('{autopf}\{#AppName}')) = 0) then
WizardForm.DirEdit.Text := ExpandConstant('{userdesktop}\{#AppName}')
else if not IsInPortableMode and (CompareText(WizardDirValue, ExpandConstant('{userdesktop}\{#AppName}')) = 0) then
WizardForm.DirEdit.Text := ExpandConstant('{autopf}\{#AppName}');
end;
//Замена пути распаковки в зависимости от типа-----Finish-----
//Создание новой страницы-----Start-----
procedure CreateInstallModePage;
begin
InputOptionPage := CreateInputOptionPage(wpWelcome, ExpandConstant('{cm:InstallModePageCaption}'),
ExpandConstant('{cm:InstallModePageDescription}'), ExpandConstant('{cm:InstallModePageSubCaption}'), True, False);
InputOptionPage.Add(ExpandConstant('{cm:InstallModePageNormalOption}'));
InputOptionPage.Add(ExpandConstant('{cm:InstallModePagePortableOption}'));;
InputOptionPage.Values[1] := ExpandConstant('{param:portable|0}') = '1';
InputOptionPage.Values[0] := not InputOptionPage.Values[1];
InputOptionPage.CheckListBox.OnClickCheck := @InstallModeListBoxClick;
end;
//Создание новой страницы-----Finish-----
//Замена текста в кнопке "Далее" в зависимости от типа-----Start-----
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpSelectTasks:
begin
if not IsInPortableMode then
WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall) else
WizardForm.NextButton.Caption := ExpandConstant('{cm:PortableButtonInstall}');
end;
end;
end;
//Замена текста в кнопке "Далее" в зависимости от типа-----Finish-----
//Уведомление о запрете распаковки в системные папки-----Start-----
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageId of
wpSelectDir:
if IsInPortableMode then
begin
Result := not IsForbiddenDir(WizardDirValue);
if not Result then
MsgBox(ExpandConstant('{cm:ForbiddenDirMessage,{#AppName}}'), mbError, MB_OK);
end;
end;
end;
//Уведомление о запрете распаковки в системные папки-----Finish-----
//Отключение страници создания папку в Пуске при выборе типа Портативная-----Start-----
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result := False;
case PageID of
wpSelectProgramGroup:
Result := IsInPortableMode;
end;
end;
//Отключение страници создания папку в Пуске при выборе типа Портативная-----Finish-----
function GetFromRes(const ResName, SaveFileName: String): Boolean;
begin
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
finally
lResStream.Free;
Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
end;
end;
//Подгрузка новой страницы-----Start-----
procedure InitializeWizard;
begin
CreateInstallModePage;
with WizardForm do
begin
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_WMSI', 'WMSI.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\WMSI.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, False);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;
//Подгрузка новой страницы-----Finish-----
procedure DeinitializeSetup();
begin
gdipShutDown();
end;
function SetFileAttributes(lpFileName: string; dwFileAttributes: integer): integer;
external 'SetFileAttributes{#A}@kernel32.dll stdcall';
procedure CurStepChanged(CurStep: TSetupStep);
var
RC: integer;
begin
if CurStep = ssInstall then
begin
Exec(ExpandConstant('taskkill'), ' /f /im IconWorkshop.exe', '', SW_HIDE, ewWaitUntilTerminated, RC);
end;
if CurStep = ssDone then
begin
if not IsInPortableMode then
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Deleted Items\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Icons\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Media Files\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Media Files\Images\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
SetFileAttributes((ExpandConstant('{userdocs}\Axialis Librarian\Objects\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
end;
if CurStep = ssDone then
begin
if not IsInPortableMode then
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') and not WizardSilent then
MsgBox('Готово!', mbInformation, MB_OK)
else
if not WizardSilent then
MsgBox('Установка {#AppName} была прервана!', mbError, MB_OK);
end;
if CurStep = ssDone then
begin
if IsInPortableMode then
if not WizardSilent then
if FileExists(ExpandConstant('{app}\IconWorkshopPortable.exe' )) then
MsgBox('Готово!', mbInformation, MB_OK)
else
if not FileExists(ExpandConstant('{app}\IconWorkshopPortable.exe' )) then
MsgBox('Установка {#AppName} была прервана!', mbError, MB_OK);
end;
end;
procedure InitializeUninstallProgressForm;
begin
with UninstallProgressForm do
begin
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_WMSI', 'WMSI.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\WMSI.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, False);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;
procedure DeinitializeUninstall();
begin
gdipShutDown();
end;
|