Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: MihailM
Дата сообщения: 05.01.2016 15:33
sjwrec , спасибо . А то вроде бы ты и давал мне что то похожее . Но после проблем с ХДД и не найду .
Еще раз спасибки !!
Автор: usermode
Дата сообщения: 05.01.2016 21:26
Может кому понадобится...

Empty Files Creator 1.0
http://www.softpedia.com/get/PORTABLE-SOFTWARE/System/File-management/Empty-Files-Creator.shtml

Программа предназначена для создания файлов-пустышек из любого каталога, включая пустые папки и пути более 255 символов.

Использование:

- Выберите каталог с целевой папкой, из которой хотите создать файлы-пустышки, а затем выберите папку выхода (должна быть пустой).
- Нажмите кнопку Create для создания точной структуры целевой папки с файлами-пустышками.

Для чего это нужно?

- Нужно это для создания инсталляционных репаков, которые используют внешние упаковщики, например, FreeArc. Идея в том, чтобы поместить файлы-пустышки в инсталлятор как оригинальные файлы для того, чтобы деинсталлятор запомнил, какие файлы нужно удалять после деинсталляции. С данной возможностью, не нужно больше использовать небезопасную DelTree функцию для папки с игрой.
Автор: bugron
Дата сообщения: 09.01.2016 11:59
Всем привет!
Обновил справку для Inno в соответствии с последней версией (5.5.7). Ссылка в шапке. Прошу обновить версию (5.5.5 -> 5.5.7) в шапке.
Автор: specxml
Дата сообщения: 12.01.2016 13:08
Всем привет!
Прошу помощи. Нужно сделать так, чтобы установщик проверял наличие каталога в папке установки, и если каталог отсутствует то не создавал его и соответственно не распаковывал туда файлы.
Например:
Source: "Файлы\*"; DestDir: "{app}\build\"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "Файлы\*"; DestDir: "{app}\build_rus\"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "Файлы\*"; DestDir: "{app}\build_eng\"; Flags: ignoreversion recursesubdirs createallsubdirs;

Проверяем какие из этих папок есть в {app} и только в существующие распаковываем. При это в папку build в любом случае распаковываем. Т.е. это должен быть какой то флаг, как мне кажется, но он не предусмотрен inno изначально.
Замучился искать, нашел только проверку на наличие файла, но этот вариант не подходит.
За ранее спасибо!
Автор: sjwrec
Дата сообщения: 12.01.2016 15:23
specxml

[more]

[Files]
Source: "Файлы\*"; DestDir: "{app}\build\"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "Файлы\*"; DestDir: "{app}\build_rus\"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: CheckRusDir
Source: "Файлы\*"; DestDir: "{app}\build_eng\"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: CheckEngDir

[Code]
function CheckRusDir:boolean;
begin
Result:= DirExists(ExpandConstant('{app}\build_rus'));
end;

function CheckEngDir:boolean;
begin
Result:= DirExists(ExpandConstant('{app}\build_eng'));
end;


[/more]

Автор: specxml
Дата сообщения: 12.01.2016 17:09
sjwrec

Спасибо большое! Работает!
Автор: frost745
Дата сообщения: 13.01.2016 12:47
Inno Setup Compiler 5.5.8

Цитата:
- The [Setup] section many now list multiple SignTool directives which will be executed in order of appearance. This can be used to dual sign (SHA1 & SHA256) Setup and Uninstall. This requires a recent signtool.exe version. Inno Setup's own installer is now also dual signed. See the help file for a dual sign example. Without dual signing Windows will no longer trust any of your new installers if they are downloaded. See http://social.technet.microsoft.com/wiki/contents/articles/32288.windows-enforcement-of-authenticode-code-signing-and-timestamping.aspx for more information.
- The console-mode compiler (ISCC) now accepts multiple /S command line parameters (to specify a Sign Tool) instead of ignoring all but the last.


Download Page: http://files.jrsoftware.org/is/5/

Автор: specxml
Дата сообщения: 13.01.2016 14:52
[more] [more=Код скрипта][Setup]
AppName=Components Descriptions
AppVerName=Components Descriptions
CreateAppDir=false

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

[Types]
Name: tweak; Description: Оптимальный выбор
Name: full; Description: Выбрать все компоненты
Name: deselect; Description: Сбросить все компоненты
Name: custom; Description: Пользовательский режим; Flags: iscustom

[Components]
Name: Safe; Description: Параметры безопасности; Types: deselect
Name: Safe\wscsvc; Description: Отключить 'Центр обеспечения безопасности'; Types: full tweak
Name: Safe\Signing; Description: Разрешить установку неподписанных драйверов; Types: full
Name: WB; Description: 'Мой компьютер' - Настройки; Types: deselect
Name: WB\Computer; Description: Добавить ярлыки - Корзина, Сетевые подключения; Types: full tweak
Name: WB\Low; Description: Уведомление о недостатке свободного места на диске
Name: WB\Low\1; Description: Изменить порог срабатывания с 10 % до 1%; Flags: exclusive; Types: tweak
Name: WB\Low\No; Description: Не предупреждать о переполнении дисков; Flags: exclusive; Types: full
Name: IE; Description: Настройки обозревателя Internet Explorer; Types: deselect
Name: IE\Cache; Description: Временные файлы Internet - использовать сжатие; Types: full tweak
Name: User; Description: Параметры входа в систему
Name: User\Logon; Description: Пользователи - использовать страницу приветствия; Flags: exclusive; Types: full
Name: User\Logon2K; Description: Классический вид - выводить запрос имени и пароля; Flags: exclusive; Types: tweak
Name: User\Autologon; Description: Задействовать автоматический вход в систему; Types: full tweak
Name: User\Sound; Description: Не сопровождать звуком загрузку и завершение работы; Types: full
Name: User\English; Description: Английский язык ввода по умолчанию для всех; Types: full
Name: Sys; Description: Настройки системы и оборудования; Types: deselect
Name: Sys\Memory; Description: Память - оптимизировать работу ядра Windows
Name: Sys\Memory\1024; Description: 1024Мб физической памяти на этом компьютере; Flags: exclusive
Name: Sys\Timeout; Description: Разрешить быстрое завершение работы; Types: full tweak

[Files]
Source: compiler:descctrl.dll; Flags: dontcopy
; скачать библиотеку descctrl.dll (6 кб) можно здесь: http://victor-dobrov.narod.ru/inno_descctrl.7z

[Code]
var Point: TPoint; CompDesc: TEdit; MessageForm: TForm; MessagePanel: TPanel; MessageLabel: TLabel; n, frame: integer; CompUpKey: Boolean; Descriptions: String; Messages: array of String;

function EnableDesc(ComponentsListHandle, DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';
procedure GetCursorPos(var Point: TPoint); external 'GetCursorPos@user32 stdcall delayload';
function SetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, wFlags: Longint):Boolean; external 'SetWindowPos@user32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: PChar; nIconIndex: LongInt): LongInt; external 'ExtractIconA@shell32 stdcall delayload';
function DrawIconEx(hdc, x, y, hIcon, cx, cy, AniCur, Draw, Flags: Longint): Longint; external 'DrawIconEx@user32 stdcall delayload';
function GetModuleHandle(lpModuleName: LongInt): LongInt; external 'GetModuleHandleA@kernel32 stdcall delayload';

Procedure DrawIcon(Form: TWinControl; File: String; nIcon, Left, Top, Size, BColor: Integer); var Panel: TPanel; Rect: TRect; Begin
Panel:= TPanel.Create(Form); Panel.SetBounds(Left, Top, Size, Size); Panel.Parent:= Form
with TBitmapImage.Create(Panel) do begin Parent:= Panel; with Bitmap do begin
Width:= Size; Height:= Size; Rect.Right:= Size; Rect.Bottom:= Size; Canvas.Brush.Color:= BColor; Canvas.FillRect(Rect);
DrawIconEx(Canvas.Handle, 0,0, ExtractIcon(GetModuleHandle(0), ExpandConstant(File), nIcon), Size, Size,0,0,3); end; end;
End;

Function StringToArray(Text, Cut: String): array of String; var t, i, k: Integer; Begin { создать массив из текста}
Repeat SetArrayLength(Result, GetArrayLength(Result) + 1); t:= 1; k:= Pos(Cut, Text); if k > 0 then t:= Length(Cut) else k:= Pos(#10, Text); i:= GetArrayLength(Result) - 1;
if k > 0 then begin Result[i]:= Copy(Text, 1, k - 1); Text:= Copy(Text, k + t, Length(Text)) end else begin Result[i]:= Text; SetLength(Text, 0) end;
Until Length(Text) = 0
End;

Procedure ResizeLabel(Obj: TLabel; Text: String; MaxWidth: Integer); var k, w, h: integer; Begin { размер формы подгоняется под текст}
Obj.AutoSize:= true; Obj.WordWrap:= false; Obj.Caption:= Text; { авторазмер}
w:= Obj.Width; h:= Obj.Height; n:= (w + frame*2)/MaxWidth + 1
Repeat
Obj.Width:= w/n + frame*2*n + k
Obj.Height:= h * n
Obj.WordWrap:= true; k:= k + 4
Until Obj.Height/h = n
End;

Procedure ShowHint(String: string; AIndex: Integer; XCenter, YCenter: Bool); Begin { размер формы подгоняется под текст, если AIndex = 0, значок не рисуется}
frame:= 10; if AIndex <> 0 then String:= ' '+ String;
GetCursorPos(Point); MessageLabel.Left:= frame; MessageLabel.Top:= frame
ResizeLabel(MessageLabel, String, WizardForm.ClientWidth)
if XCenter then Point.X:= WizardForm.Left + WizardForm.Width/2 - (MessageLabel.Width + frame*2 -2)/2 else Point.X:= Point.X + 12;
if YCenter then Point.Y:= WizardForm.Top + WizardForm.BeveledLabel.Top else Point.Y:= Point.Y + 12;
MessageForm.SetBounds(Point.X, Point.Y, MessageLabel.Width + frame*2 -2, MessageLabel.Height + frame*2 -2)
if AIndex <> 0 then DrawIcon(MessageForm, '{sys}\shell32.dll', AIndex, 9, 8, 16, MessagePanel.Color);
MessageForm.Show; SetWindowPos(MessageForm.Handle, -1, 0, 0, 0, 0, 3);
End;

Procedure CompKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); Begin
CompUpKey:= true
n:= WizardForm.ComponentsList.ItemIndex
if n >= 0 then ShowHint(Messages[n], -1001, true, true) else MessageForm.Hide;
End;

Procedure ObjectOnClick(Sender: TObject);
Begin
Case TObject(Sender) of { событие объекта}
CompDesc:
if CompDesc.Text > '' then
if CompUpKey then CompUpKey:= false else ShowHint(CompDesc.Text, -1001, false, false)
else MessageForm.Hide;
MessageForm:
WizardForm.BringToFront;
end;
End;

Procedure DeinitializeSetup();
Begin
disabledesc();
End;

Procedure CurStepChanged(CurStep: TSetupStep);
Begin
if CurStep = ssInstall then disabledesc;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = wpSelectComponents then enableDesc(WizardForm.ComponentsList.Handle,CompDesc.Handle,Descriptions) else MessageForm.Hide;
End;

Procedure InitializeWizard;
Begin
CompDesc:= TEdit.Create(WizardForm)
CompDesc.Parent:= WizardForm
CompDesc.Visible:= false
CompDesc.OnChange:= @ObjectOnClick
MessageForm:= CreateCustomForm;
MessageForm.BorderStyle:= bsNone
MessageForm.OnActivate:= @ObjectOnClick
MessagePanel:= TPanel.Create(MessageForm)
MessagePanel.BevelInner:= bvLowered;
MessagePanel.Align:= alClient;
MessagePanel.Color:= $E1FFFF;
MessagePanel.Parent:= MessageForm
MessageLabel:= TLabel.Create(MessagePanel)
MessageLabel.Transparent:= true
MessageLabel.Font.Name:= 'Arial'
MessageLabel.Font.Size:= WizardForm.Font.Size + 1
MessageLabel.Parent:= MessagePanel
WizardForm.ComponentsList.OnKeyUp:= @CompKeyUp
Descriptions:=
'Демонстрационный режим. Действия по изменению настроек системы или параметров безопасности не выполняются. Компоненты и их описания даны только для примера. Описания отделяются друг от друга точкой с запятой и должны содержать не более 255 символов.;' +
'Отключить «Центр обеспечения безопасности» (рекомендуется отключить эту практически бесполезную службу);' +
'Разрешить установку неподписанных драйверов (упрощает настройку компьютера сразу после установки системы);' +
'«Мой компьютер» - Секция настроек, влияющих на работу компьютера;' +
'ярлыки Корзина и Сетевые подключения будут созданы в папке «Мой компьютер»;' +
'Изменить порог срабатывание уведомления о недостатке свободного места на диске;' +
'Изменить порог срабатывания с 10 % (значение по-умолчанию) до 1% (необходимо для дисков большой ёмкости);' +
'Выдача всплывающей подсказки о переполнении дисков будет отключена;' +
'Общие настройки обозревателя Internet Explorer;' +
'Папка временных файлов Internet Explorer будет сжата средствами файловой системы NTFS;' +
'Параметры входа в систему;' +
'Пользователи - использовать страницу приветствия (новый экран загрузки, появившийся в Windows XP);' +
'Классический вид - выводить запрос имени и пароля (экран загрузки, использующийся в Windows 2000);' +
'Задействовать автоматический вход в систему для текущего пользователя без запроса имени и пароля;' +
'Не сопровождать звуком загрузку и завершение работы (немного ускоряет загрузку «Рабочего стола»);' +
'Английский язык ввода по умолчанию для всех (для новых пользователей);' +
'Настройка системы на имеющийся объём оперативной памяти и процессорного кэша, оптимизация файловой подсистемы;' +
'После установке данной опции уменьшать объём оперативной памяти НЕЖЕЛАТЕЛЬНО;' +
'Вычисленный объём установленной физической памяти на этом компьютере;' +
'Разрешить быстрое завершение работы (сетевые соединения могут быть разорваны преждевременно)';
Messages:= StringToArray(Descriptions,';')
End;[/more]


Кто в разбирается, скажите пожалуйста в чем проблема скрипта описания компонентов. Код скрипта выше.
При просмотре компонентов рамка с описанием имеет разные глюки, и зависимость этих глюков от чего-либо найти не удалось. Бывает рамка с описанием мигает и само описание не всегда отображается. Зачастую пустое окно рамки, или просто установщик лагает и описание так же не видно. Бывает что прыгает в верхний левый угол экрана пустая рамка и т.п. Как можно сделать более грамотный вывод описания.
В идеале еще картинки как то сюда добавить. Готов оплатить разработку описания для установщика, кому интересно. [/more]
Автор: specxml
Дата сообщения: 14.01.2016 11:00
Не ужели никто не знает как поправить? Своими кривыми руками, что то совсем не получается.
Автор: ultimo
Дата сообщения: 14.01.2016 12:11
specxml
ничего необычного не заметил. Немного добавил:

[more]
[Setup]
AppName=Components Descriptions
AppVerName=Components Descriptions
CreateAppDir=false

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

[Types]
Name: tweak; Description: Оптимальный выбор
Name: full; Description: Выбрать все компоненты
Name: deselect; Description: Сбросить все компоненты
Name: custom; Description: Пользовательский режим; Flags: iscustom

[Components]
Name: Safe; Description: Параметры безопасности; Types: deselect
Name: Safe\wscsvc; Description: Отключить 'Центр обеспечения безопасности'; Types: full tweak
Name: Safe\Signing; Description: Разрешить установку неподписанных драйверов; Types: full
Name: WB; Description: 'Мой компьютер' - Настройки; Types: deselect
Name: WB\Computer; Description: Добавить ярлыки - Корзина, Сетевые подключения; Types: full tweak
Name: WB\Low; Description: Уведомление о недостатке свободного места на диске
Name: WB\Low\1; Description: Изменить порог срабатывания с 10 % до 1%; Flags: exclusive; Types: tweak
Name: WB\Low\No; Description: Не предупреждать о переполнении дисков; Flags: exclusive; Types: full
Name: IE; Description: Настройки обозревателя Internet Explorer; Types: deselect
Name: IE\Cache; Description: Временные файлы Internet - использовать сжатие; Types: full tweak
Name: User; Description: Параметры входа в систему
Name: User\Logon; Description: Пользователи - использовать страницу приветствия; Flags: exclusive; Types: full
Name: User\Logon2K; Description: Классический вид - выводить запрос имени и пароля; Flags: exclusive; Types: tweak
Name: User\Autologon; Description: Задействовать автоматический вход в систему; Types: full tweak
Name: User\Sound; Description: Не сопровождать звуком загрузку и завершение работы; Types: full
Name: User\English; Description: Английский язык ввода по умолчанию для всех; Types: full
Name: Sys; Description: Настройки системы и оборудования; Types: deselect
Name: Sys\Memory; Description: Память - оптимизировать работу ядра Windows
Name: Sys\Memory\1024; Description: 1024Мб физической памяти на этом компьютере; Flags: exclusive
Name: Sys\Timeout; Description: Разрешить быстрое завершение работы; Types: full tweak

[Files]
Source: compiler:descctrl.dll; Flags: dontcopy

[_Code]

#ifdef UNICODE
type
PChar=PAnsiChar;
#endif

var
Point: TPoint; CompDesc: TEdit; MessageForm: TForm; MessagePanel: TPanel; MessageLabel: TLabel; n, frame: integer; CompUpKey: Boolean; Descriptions: String; Messages: array of String;

function EnableDesc(ComponentsListHandle, DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';
procedure GetCursorPos(var Point: TPoint); external 'GetCursorPos@user32 stdcall delayload';
function SetWindowPos(hWnd, hWndInsertAfter, X, Y, cx, cy, wFlags: Longint):Boolean; external 'SetWindowPos@user32.dll stdcall';
function ExtractIcon(hInst: LongInt; lpszExeFileName: PChar; nIconIndex: LongInt): LongInt; external 'ExtractIconA@shell32 stdcall delayload';
function DrawIconEx(hdc, x, y, hIcon, cx, cy, AniCur, Draw, Flags: Longint): Longint; external 'DrawIconEx@user32 stdcall delayload';
function GetModuleHandle(lpModuleName: LongInt): LongInt; external 'GetModuleHandleA@kernel32 stdcall delayload';

function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';

Procedure DrawIcon(Form: TWinControl; File: String; nIcon, Left, Top, Size, BColor: Integer); var Panel: TPanel; Rect: TRect; Begin
Panel:= TPanel.Create(Form); Panel.SetBounds(Left, Top, Size, Size); Panel.Parent:= Form
with TBitmapImage.Create(Panel) do begin Parent:= Panel; with Bitmap do begin
Width:= Size; Height:= Size; Rect.Right:= Size; Rect.Bottom:= Size; Canvas.Brush.Color:= BColor; Canvas.FillRect(Rect);
DrawIconEx(Canvas.Handle, 0,0, ExtractIcon(GetModuleHandle(0), ExpandConstant(File), nIcon), Size, Size,0,0,3); end; end;
End;

Function StringToArray(Text, Cut: String): array of String; var t, i, k: Integer; Begin { создать массив из текста}
Repeat SetArrayLength(Result, GetArrayLength(Result) + 1); t:= 1; k:= Pos(Cut, Text); if k > 0 then t:= Length(Cut) else k:= Pos(#10, Text); i:= GetArrayLength(Result) - 1;
if k > 0 then begin Result[i]:= Copy(Text, 1, k - 1); Text:= Copy(Text, k + t, Length(Text)) end else begin Result[i]:= Text; SetLength(Text, 0) end;
Until Length(Text) = 0
End;

Procedure ResizeLabel(Obj: TLabel; Text: String; MaxWidth: Integer); var k, w, h: integer; Begin { размер формы подгоняется под текст}
Obj.AutoSize:= true; Obj.WordWrap:= false; Obj.Caption:= Text; { авторазмер}
w:= Obj.Width; h:= Obj.Height; n:= (w + frame*2)/MaxWidth + 1
Repeat
Obj.Width:= w/n + frame*2*n + k
Obj.Height:= h * n
Obj.WordWrap:= true; k:= k + 4
Until Obj.Height/h = n
End;

Procedure ShowHint(String: string; AIndex: Integer; XCenter, YCenter: Bool); Begin { размер формы подгоняется под текст, если AIndex = 0, значок не рисуется}
frame:= 10; if AIndex <> 0 then String:= ' '+ String;
GetCursorPos(Point); MessageLabel.Left:= frame; MessageLabel.Top:= frame
ResizeLabel(MessageLabel, String, WizardForm.ClientWidth)
if XCenter then Point.X:= WizardForm.Left + WizardForm.Width/2 - (MessageLabel.Width + frame*2 -2)/2 else Point.X:= Point.X + 12;
if YCenter then Point.Y:= WizardForm.Top + WizardForm.BeveledLabel.Top else Point.Y:= Point.Y + 12;
MessageForm.SetBounds(Point.X, Point.Y, MessageLabel.Width + frame*2 -2, MessageLabel.Height + frame*2 -2)
if AIndex <> 0 then DrawIcon(MessageForm, '{sys}\shell32.dll', AIndex, 9, 8, 16, MessagePanel.Color);
MessageForm.Show; SetWindowPos(MessageForm.Handle, -1, 0, 0, 0, 0, 3);
End;

Procedure CompKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); Begin
CompUpKey:= true
n:= WizardForm.ComponentsList.ItemIndex
if n >= 0 then ShowHint(Messages[n], -1001, true, true) else MessageForm.Hide;
End;

Procedure ObjectOnClick(Sender: TObject);
Begin
Case TObject(Sender) of { событие объекта}
CompDesc:
if CompDesc.Text > '' then
if CompUpKey then CompUpKey:= false else ShowHint(CompDesc.Text, -1001, false, false)
else MessageForm.Hide;
MessageForm:
WizardForm.BringToFront;
end;
End;

Procedure DeinitializeSetup();
Begin
disabledesc();
End;

Procedure CurStepChanged(CurStep: TSetupStep);
Begin
if CurStep = ssInstall then disabledesc;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
if CurPageID = wpSelectComponents then enableDesc(WizardForm.ComponentsList.Handle,CompDesc.Handle,Descriptions) else MessageForm.Hide;
End;

Procedure InitializeWizard;
Begin
SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) or $2000000);
CompDesc:= TEdit.Create(WizardForm)
CompDesc.Parent:= WizardForm
CompDesc.Visible:= false
CompDesc.OnChange:= @ObjectOnClick
MessageForm:= CreateCustomForm;
MessageForm.BorderStyle:= bsNone
MessageForm.OnActivate:= @ObjectOnClick
MessagePanel:= TPanel.Create(MessageForm)
MessagePanel.BevelInner:= bvLowered;
MessagePanel.Align:= alClient;
MessagePanel.Color:= $E1FFFF;
MessagePanel.Parent:= MessageForm
MessageLabel:= TLabel.Create(MessagePanel)
MessageLabel.Transparent:= true
MessageLabel.Font.Name:= 'Arial'
MessageLabel.Font.Size:= WizardForm.Font.Size + 1
MessageLabel.Parent:= MessagePanel
WizardForm.ComponentsList.OnKeyUp:= @CompKeyUp
Descriptions:=
'Демонстрационный режим. Действия по изменению настроек системы или параметров безопасности не выполняются. Компоненты и их описания даны только для примера. Описания отделяются друг от друга точкой с запятой и должны содержать не более 255 символов.;' +
'Отключить «Центр обеспечения безопасности» (рекомендуется отключить эту практически бесполезную службу);' +
'Разрешить установку неподписанных драйверов (упрощает настройку компьютера сразу после установки системы);' +
'«Мой компьютер» - Секция настроек, влияющих на работу компьютера;' +
'ярлыки Корзина и Сетевые подключения будут созданы в папке «Мой компьютер»;' +
'Изменить порог срабатывание уведомления о недостатке свободного места на диске;' +
'Изменить порог срабатывания с 10 % (значение по-умолчанию) до 1% (необходимо для дисков большой ёмкости);' +
'Выдача всплывающей подсказки о переполнении дисков будет отключена;' +
'Общие настройки обозревателя Internet Explorer;' +
'Папка временных файлов Internet Explorer будет сжата средствами файловой системы NTFS;' +
'Параметры входа в систему;' +
'Пользователи - использовать страницу приветствия (новый экран загрузки, появившийся в Windows XP);' +
'Классический вид - выводить запрос имени и пароля (экран загрузки, использующийся в Windows 2000);' +
'Задействовать автоматический вход в систему для текущего пользователя без запроса имени и пароля;' +
'Не сопровождать звуком загрузку и завершение работы (немного ускоряет загрузку «Рабочего стола»);' +
'Английский язык ввода по умолчанию для всех (для новых пользователей);' +
'Настройка системы на имеющийся объём оперативной памяти и процессорного кэша, оптимизация файловой подсистемы;' +
'После установке данной опции уменьшать объём оперативной памяти НЕЖЕЛАТЕЛЬНО;' +
'Вычисленный объём установленной физической памяти на этом компьютере;' +
'Разрешить быстрое завершение работы (сетевые соединения могут быть разорваны преждевременно)';
Messages:= StringToArray(Descriptions,';')
End;
[/more]
Автор: specxml
Дата сообщения: 14.01.2016 12:15
ultimo
Спасибо, но в вашем варианте подсказки(описание) совсем не хотят отображаться.
Автор: ultimo
Дата сообщения: 14.01.2016 12:33
specxml
какой версией компиллите?

Добавлено:
specxml
а убрали _ перед Code?
Автор: specxml
Дата сообщения: 14.01.2016 12:44
ultimo
_ Перед code не заметил Убрал и появилось описание. Спасибо!!!
Вот только скажите пожалуйста, вернее растолкуйте для чайника какие изменения вы внесли, и что от этого изменилось. Визуально пока что не замечаю разницы, но судя по миганию установщика (которые никуда не делись) глюки о которых я говорил останутся
Мне кажется здесь нужно изменять именно способ вывода этих окон на совсем другой.
Автор: ultimo
Дата сообщения: 14.01.2016 12:54
specxml
Добавил пару функций, SetWindowLong помогает избежать мерцание ComponentsList.

А вот с окном не разбирался, времени нету
Автор: tempMISHANCHYK
Дата сообщения: 16.01.2016 09:35
Подскажите пожалуйста, как правильно записать в секцию [Icons] если нужно чтоб название было в кавычках?

Код: Name: {group}\Справка "О программе"; Filename: {app}\Help.chm;
Автор: ultimo
Дата сообщения: 16.01.2016 09:53
tempMISHANCHYK
никак. Имя не может содержать кавычки (двойные). Напиши просто О программе
Автор: sjwrec
Дата сообщения: 16.01.2016 16:09
ultimo

Цитата:
ничего необычного не заметил. Немного добавил:

Пожалуйста не захламляйте тему огромным сообщением. Смените тэг Code на More
Автор: ultimo
Дата сообщения: 16.01.2016 16:56
sjwrec
простите, учту
Автор: sjwrec
Дата сообщения: 16.01.2016 17:04
ultimo
Всё нормально. Просто отредактируйте ваше сообщение выше и в теме сразу станет больше места. Благодарю за понимание.
Автор: MihailM
Дата сообщения: 18.01.2016 00:47
sjwrec вопрос а destdir указывать {app} или {code:AvPatch} ..
А то у меня не хочет распаковываться инсталяшка , ругается .
Вот скрины : 1. http://prntscr.com/9rf9rq , 2. http://prntscr.com/9rfa11
А вот уже ошибка : http://prntscr.com/9rfafl. Что за фигня понять не могу .
Вроде путь правильный , а ругается ..
[more]Здесь кода (не весь) :
Код:
[Setup]
....
DefaultDirName={code:AvPatch}
....
Compression=lzma2/Ultra
SolidCompression=true
DisableDirPage=false
AllowRootDirectory=true
DirExistsWarning=no
InternalCompressLevel=Ultra
Uninstallable=false
UsePreviousGroup=false
AppendDefaultGroupName=false
DisableProgramGroupPage=yes
AlwaysShowComponentsList=false
ShowComponentSizes=false
FlatComponentsList=false
UsePreviousTasks=true
DisableFinishedPage=false
AlwaysShowDirOnReadyPage=true
CreateUninstallRegKey=false
UpdateUninstallLogAppName=false
AllowUNCPath=true // это я уже добавил . вдруг помогло бы .

[Files]
Source: путь\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs;

[_Code]
{ RedesignWizardFormBegin } // Don't remove this line!
// Don't modify this section. It is generated automatically.
procedure RedesignWizardForm;
begin
with WizardForm.DirBrowseButton do
begin
Enabled := False;
Visible := False;
end;

with WizardForm.DirEdit do
begin
ReadOnly := false;
end;

{ ReservationBegin }
// This part is for you. Add your specialized code here.

{ ReservationEnd }
end;
// Don't modify this section. It is generated automatically.
{ RedesignWizardFormEnd } // Don't remove this line!

procedure InitializeWizard();
begin
RedesignWizardForm;
end;

// Начало Процедура "Определение местонахождения игры"
function AvPatch(Default: String): String;
var AvRes: String;
begin
RegQueryStringValue(HKEY_CURRENT_USER, 'Software\Valve\Steam','SourceModInstallPath', AvRes);
if AvRes = '' then RegQueryStringValue(HKEY_CURRENT_USER, 'Software\Wow6432Node\Valve\Steam','SteamPath', AvRes);
if AvRes = '' then Result:= 'Steam';
//if AvRes = '' then Result:= 'Steam\SteamApps\sourcemods';
if AvRes <> '' then Result:= AvRes;
//if AvRes = 'Steam' then DisableDirPage=no;
end;
// Конец Процедура "Определение местонахождения игры"
Автор: sjwrec
Дата сообщения: 18.01.2016 05:50
MihailM
Да в DestDir указывать {app}
Ошибка, что в пути попадается символ запрещённый для windows. По коду не видно что туда попадает.


Код:
[Setup]
; это я уже добавил . вдруг помогло бы
AllowUNCPath=true
Автор: MihailM
Дата сообщения: 18.01.2016 12:09
sjwrec Да код же практически такой же , просто на свои ключи поменял .
Мне надо именно это ключ , чтобы определялся , потому что в эту папку будет потом устанавливаться игра (апдейт) итд...Потом у меня код работает же , то есть ключ определяется правильно на х32 .
По крайней мере у меня на ХРюшке.

А вот потом , что не нравится не понятно .
[more] вот такой код :
Код:
[_Code]
{ RedesignWizardFormBegin } // Don't remove this line!
// Don't modify this section. It is generated automatically.
procedure RedesignWizardForm;
begin
with WizardForm.DirBrowseButton do
begin
Enabled := False;
Visible := False;
end;

with WizardForm.DirEdit do
begin
ReadOnly := false;
end;

{ ReservationBegin }
// This part is for you. Add your specialized code here.

{ ReservationEnd }
end;
// Don't modify this section. It is generated automatically.
{ RedesignWizardFormEnd } // Don't remove this line!

procedure InitializeWizard();
begin
RedesignWizardForm;
end;

// Начало Процедура "Определение местонахождения игры"
function AvPatch(Default: String): String;
var AvRes: String;
begin
RegQueryStringValue(HKEY_CURRENT_USER, 'Software\Wow6432Node\Valve\Steam','SourceModInstallPath', AvRes);
if AvRes = '' then RegQueryStringValue(HKEY_CURRENT_USER, 'Software\Valve\Steam','SourceModInstallPath', AvRes);
if AvRes = '' then Result:= 'C:\Program Files\Steam\steamapps\sourcemods';
if AvRes <> '' then Result:= AvRes;
//if AvRes = 'Steam' then DisableDirPage=no;
end;
// Конец Процедура "Определение местонахождения игры"

Автор: sjwrec
Дата сообщения: 18.01.2016 19:20
MihailM
В коде ошибку не вижу. Странно это всё. У меня на этом коде Русификатор 7DTD был сделан. Скачивало множество людей и не у кого такой ошибки не было.
Автор: MihailM
Дата сообщения: 18.01.2016 20:55
sjwrec вот вот , кстати я что подумал , а от версии компилятора может зависит то , скажем ANSI и UNICODE версия . Просто может при считывании из реестра , он скажем читается в UNICODE ну или в другом .. Может просто надо перевести в ANSI - AvPatch или наоборот ?
Что то в справке не нашел это .
p.s. это всё как бы догадки .
Автор: sjwrec
Дата сообщения: 18.01.2016 22:10
MihailM

Ну попробуйте в функции заменить String на AnsiString

Раньше я русификатор на ANSI компилировал и всё работало. Сейчас я им уже не занимаюсь, но инсталлы компилирую на UNICODE теперь.
Автор: Habib2302
Дата сообщения: 19.01.2016 11:07
Доброе время суток. Как полностью скрыть Preparing Page и чтобы не возникала не при каких обстаятельствах
Автор: ultimo
Дата сообщения: 19.01.2016 13:31
Habib2302

[more]

Код:
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID=wpPreparing then
Result:=true;
end;
Автор: Habib2302
Дата сообщения: 19.01.2016 14:11
ultimo
не помогло


[more=Скрипт]
Код: ; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AIMP"
#define MyAppVersion "4.00.1687"
#define Exe "AIMP.exe"
#include "WinTB.iss"
#include "botva2.iss"
#include "BrowseForm.iss"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion} Final RePack (& Portable) by Pilot
SetupIconFile=ico.ico
Compression=lzma2/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
ShowLanguageDialog=yes
UninstallDisplayIcon={uninstallexe}
UninstallFilesDir={app}\Uninstall
DisableFinishedPage=yes
RawDataResource=Botva:botva2.dll|b2p:b2p.dll|Logo:logo.png|LiPic:LiPic.png
AppModifyPath={app}
VersionInfoProductName={#MyAppName}
DirExistsWarning=no
DisableReadyPage=true
AppID={#MyAppName}
VersionInfoDescription={#MyAppName} RePack by Pilot
AppCopyright=Pilot © 2015
VersionInfoVersion={#MyAppVersion}
VersionInfoProductVersion={#MyAppVersion}
VersionInfoCopyright=Pilot © 2015
UninstallDisplayName={#MyAppName}
ComponentsListTVStyle=true
ShowComponentSizes=false
Uninstallable=not IsComponentSelected('AIMP\P')
DisableProgramGroupPage=yes
CreateUninstallRegKey=not IsComponentSelected('AIMP\P')
InfoBeforeFile=Info.rtf
DisableWelcomePage=true
RestartIfNeededByRun=false

[Languages]
Name: "R"; MessagesFile: "Russian.isl"
Name: "E"; MessagesFile: "English.isl"
Name: "U"; MessagesFile: "Ukrainian.isl"

[Types]
Name: full; Description: Полная установка; Flags: iscustom

[Tasks]
Name: ic; Description: {cm:AdditionalIcons}; Components: AIMP\I;
Name: ic\desktop; Description: {cm:CreateDesktopIcon}; Components: AIMP\I;
Name: ic\group; Description: {cm:CreateStartMenuIcon}; Components: AIMP\I;
Name: ic\quicklaunch; Description: {cm:CreateQuickLaunchIcon}; OnlyBelowVersion: 0,6.1; Components: AIMP\I; Flags: unchecked
Name: ic\taskbar; Description: {cm:PinTaskbarIcon}; MinVersion: 0.0,6.1.7600; Components: AIMP\I; Flags: unchecked
Name: ic\startmenu; Description: {cm:PinStartMenuIcon}; MinVersion: 0.0,6.1.7600; Components: AIMP\I; Flags: unchecked
Name: aimp; Description: {#MyAppName}; Components: AIMP\I;
Name: aimp\i; Description: Интегрировать в Windows; Components: AIMP\I;
Name: aimp\r; Description: Ассоциировать {#MyAppName} с аудио файлами и плейлистами; Components: AIMP\I;
Name: aimp\m; Description: Добавить пункт в конекстное меню Проводника Windows; Components: AIMP\I;

[Components]
Name: AIMP; Description: {#MyAppName}; Flags: fixed disablenouninstallwarning; Types: full;
Name: AIMP\I; Description: Установить {#MyAppName}; Flags: exclusive disablenouninstallwarning
Name: AIMP\P; Description: Распаковать {#MyAppName}; Flags: exclusive disablenouninstallwarning

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора;
Source: WinTB.dll; Flags: dontcopy;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов
Source: {app}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs;

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#Exe}; Components: AIMP\I; Tasks: ic\group;
Name: {group}\{#MyAppName} Advanced Tag Editor; Filename: {app}\AIMPate.exe; Components: AIMP\I; Tasks: ic\group;
Name: {group}\{#MyAppName} Audio Converter; Filename: {app}\AIMPac.exe; Components: AIMP\I; Tasks: ic\group;
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}; Components: AIMP\I; Tasks: ic\group;
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#Exe}; Components: AIMP\I; Tasks: ic\desktop;
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Filename: {app}\{#Exe}; Components: AIMP\I; Tasks: ic\quicklaunch;

[Run]
Filename: {app}\{#Exe}; Tasks: aimp\i; Parameters: "/REG=I"; Components: AIMP\I;
Filename: {app}\{#Exe}; Tasks: aimp\r; Parameters: "/REG=R"; Components: AIMP\I;
Filename: {app}\{#Exe}; Tasks: aimp\m; Parameters: "/REG=MENU"; Components: AIMP\I;

[UninstallRun]
Filename: {app}\{#Exe}; Parameters: "/REG=UALL"; Components: AIMP\I;

[Code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

#define A = (Defined UNICODE) ? "W" : "A"

const
///////////////////////////////////Относится к лого и изображениям мастера
RT_RCDATA = 10;
LOAD_LIBRARY_AS_DATAFILE = $2;

var
///////////////////////////////////Лого и изображения
lPLogo, lPicHandle: THandle;
BtnImage: TBitmapImage;
NewGroupBox1: TNewGroupBox;
NewCheckBox1: TNewCheckBox;
///////////////////////////////////////////
iInitialize: Boolean;

///////////////////////////////////Ресурсы(относится к лого и изображениям мастера)
function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
lResStream: TResourceStream;
begin
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
lResStream.SaveToFile(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
finally
lResStream.Free;
Result := FileExists(AddBackslash(ExpandConstant('{tmp}')) + SaveFileName);
end;
end;

function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID=wpPreparing then
Result:=true;
end;

procedure InitializeWizard;
begin
PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage
with WizardForm do
begin
///////////////////////////////////Логотип и изображения мастера
iInitialize := True;
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') then
begin
///////////////////////////////////Изображения
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);

DiskSpaceLabel.Hide;
ComponentsDiskSpaceLabel.Hide;
InfoBeforeClickLabel.Hide;
SelectDirBitmapImage.Hide;
SelectDirBrowseLabel.Hide;
////////////////////////////////////////////

NewGroupBox1 := TNewGroupBox.Create(WizardForm);
with NewGroupBox1 do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(124);
Width := ScaleX(417);
Height := ScaleY(57);
Caption := 'Папка установки';
end;

with WizardForm.DirBrowseButton do
begin
Parent := NewGroupBox1;
SetBounds(ScaleX(333),ScaleY(20),ScaleX(75),ScaleY(23));
Caption:='Обзор...';
OnClick:=@BrowseClick;
end;

with WizardForm.DirEdit do
begin
Parent := NewGroupBox1;
Left := ScaleX(12);
Top := ScaleY(22);
Width := ScaleX(312);
end;

///////////////////////////////////Логотип

lPLogo:= ImgLoad(WizardForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(118), ScaleY(35), True, True);
ImgApplyChanges(WizardForm.Handle);
end;

///////////////////////////////////WinTB
ExtractTemporaryFile('WinTB.dll');
TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);
//////////////////////////////////////

NewCheckBox1 := TNewCheckBox.Create(WizardForm);
with NewCheckBox1 do
begin
Parent := WizardForm.InfoBeforePage;
SetBounds(ScaleX(0), ScaleY(216), ScaleX(417), ScaleY(17));
Caption := 'Посетить сайт автора | repackbypilot.blogspot.com';
Enabled := True;
end;

with InfoBeforeMemo do
begin
Top := ScaleY(0);
with ComponentsList do
begin
Height := ScaleY(180);
with SelectDirLabel do
begin
Left := ScaleX(0);
Top := ScaleY(0);
Width := ScaleX(417);
Height := ScaleY(115);
end;
end;
end;

with TLabel.Create(WizardForm) do
begin
Parent:=WizardForm;
AutoSize:=False;
Transparent:= true;
SetBounds(ScaleX(20), ScaleY(320), ScaleX(118), ScaleY(35));
end;
end;
end;


function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';

function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;
// szFilename : full path to executable file
// IsPin......: False - unpin from TaskBar, True - pin to TaskBar
var
hInst: THandle;
buf: array [0..255] of Char;
i, res: Integer;
strLnk, strVerb: String;
objShell, colVerbs: Variant;
begin
Result := False;
if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit; { below Windows 7 }

{ String resources }
if IsPin then
begin
if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
begin
while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
end;
res := 5386; { Pin to Tas&kbar }
end else res := 5387; { Unpin from Tas&kbar }

{ Load string resource }
hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
if hInst <> 0 then
try
for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
try
objShell := CreateOleObject('Shell.Application');
colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
begin
colVerbs.Item[i].DoIt;
Result := True;
Break;
end;
except
Exit;
end;
finally
FreeDLL(hInst);
end;
end;

/////////////////////////////////////////////////////////////////////////
function PinToStartMenu(const szFilename: String; IsPin: Boolean): Boolean;
// szFilename : full path to exe- or lnk-file
// IsPin......: False - unpin from StartMenu, True - pin to StartMenu
var
hInst: THandle;
buf: array [0..259] of Char;
i, res: Integer;
strLnk, strVerb: String;
objShell, colVerbs: Variant;
begin
Result := False;
if not FileExists(szFilename) then Exit;
if GetWindowsVersion > $06020000 then Exit; { Window 8 and above }

{ Windows 7 }
if (GetWindowsVersion >= $06010000) and boolean(SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0)) then
begin
while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\StartMenu\') + ExtractFileName(strLnk)) then Exit;
end;

{ String resources }
if IsPin then
res := 5381 { Pin to Start Men&u }
else
res := 5382; { Unpin from Start Men&u }

{ Load string resource }
hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
if hInst <> 0 then
try
for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
try
objShell := CreateOleObject('Shell.Application');

{ below Windows 7 }
if GetWindowsVersion < $06010000 then
begin
objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).InvokeVerb(strVerb);
Result := True;
end;

{ Windows 7 }
if GetWindowsVersion >= $06010000 then
begin
colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
begin
colVerbs.Item[i].DoIt;
Result := True;
Break;
end;
end;
except
Exit;
end;
finally
FreeDLL(hInst);
end;
end;

function ParamExists(S: String): Boolean;
var
i: Integer;
begin
Result:= False;
for i:= 0 to ParamCount() do begin
if Pos(Uppercase(S), Uppercase(ParamStr(i))) > 0 then begin
Result:= true;
Break;
end;
end;
end;

function GetCmdDirValue(): String;
var
i: Integer;
begin
Result:= '';
for i:= 0 to ParamCount() do begin
if (Pos('/DIR', Uppercase(ParamStr(i))) > 0) then begin
Result:= Copy(ParamStr(i), 6, Length(ParamStr(i)));
StringChange(Result, 'expand:', '');
StringChange(Result, 'EXPAND:', '');
Result:= ExpandConstant(Result);
Break;;
end;
end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
Case CurPageID of
wpSelectTasks:
if IsComponentSelected('AIMP\I') then
begin
WizardForm.NextButton.Caption:= SetupMessage(msgButtonInstall);
end;

wpSelectDir: if WizardForm.Tag = 1 then

begin
WizardForm.SelectDirPage.Notebook.ActivePage:= WizardForm.SelectComponentsPage;
WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectComponents);
WizardForm.Hint:= WizardForm.PageDescriptionLabel.Caption; // запомнить SetupMessage(msgSelectDirDesc)
WizardForm.PageDescriptionLabel.Caption:= SetupMessage(msgSelectComponentsDesc);
end;
wpSelectComponents: if WizardForm.Tag = 1 then
begin
WizardForm.SelectComponentsPage.Notebook.ActivePage:= WizardForm.SelectDirPage;
WizardForm.DiskSpaceLabel.Caption:= WizardForm.ComponentsDiskSpaceLabel.Caption;
WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectDir);
WizardForm.PageDescriptionLabel.Caption:= WizardForm.Hint; // иначе вместо названия программы [name]
if (not ParamExists('/dir')) then begin
if IsComponentSelected('AIMP\I') then
WizardForm.DirEdit.Text := (ExpandConstant('{#SetupSetting("DefaultDirName")}'))
else if IsComponentSelected('AIMP\P') then begin
WizardForm.DirEdit.Text := AddBackslash(ExpandConstant('{src}')) + '{#MyAppName} Portable'
WizardForm.NextButton.Caption:= CustomMessage('ButtonPortable');
end;
end else
WizardForm.DirEdit.Text := GetCmdDirValue();
end;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
RC: integer;
begin
if CurStep = ssDone then
if IsTaskSelected('ic\taskbar') then
PinToTaskbar(ExpandConstant('{app}\{#Exe}'), True);
if CurStep = ssDone then
if IsTaskSelected('ic\startmenu') then
PinToStartMenu(ExpandConstant('{app}\{#Exe}'), True);
if CurStep = ssDone then
if not WizardSilent then
MsgBox('Всё готово, приятного пользования ', mbInformation, MB_OK);
if CurStep = ssDone then
if NewCheckBox1.Checked then
ShellExec('open','http://repackbypilot.blogspot.com','', '', SW_SHOW, ewNoWait, RC)
end;

procedure DeinitializeSetup();
begin
if iInitialize then
begin
gdipShutdown;
TaskBarDestroy;
end;
end;

procedure InitializeUninstallProgressForm;
begin
with UninstallProgressForm do
begin
///////////////////////////////////Логотип и изображения мастера
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_B2P', 'b2p.dll') and GetFromRes('_IS_LOGO', 'logo.png') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
begin
///////////////////////////////////Изображения
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);

///////////////////////////////////Логотип
lPLogo:= ImgLoad(UninstallProgressForm.Handle, ExpandConstant('{tmp}\logo.png'), ScaleX(20), ScaleY(320), ScaleX(118), ScaleY(35), True, True);
ImgApplyChanges(UninstallProgressForm.Handle);
end;

with TLabel.Create(nil) do
begin
Parent:=UninstallProgressForm;
AutoSize:=False;
Transparent:= true;
SetBounds(ScaleX(20), ScaleY(320), ScaleX(118), ScaleY(35));
end;
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
instPath: string;
begin
case CurUninstallStep of
usUninstall:
begin
PinToTaskbar(ExpandConstant('{app}\{#Exe}'), False);
PinToStartMenu(ExpandConstant('{app}\{#Exe}'), False);
end;
usPostUninstall:
if DirExists(AddBackslash(ExpandConstant('{userappdata}')) + 'AIMP') then
begin
if MsgBoxEx(0, 'Удалить настройки программы?', 'Удаление настроек', $00000004 or $00000020, 0, 0) = IDYES then
DelTree(AddBackslash(ExpandConstant('{userappdata}')) + 'AIMP', True, True, True);

end;
end;
end;

procedure DeinitializeUninstall();
begin
if iInitialize then gdipShutdown;
end;

[UninstallDelete]
Name: {app}; Type: filesandordirs;

[Messages]
BeveledLabel=RePack by Pilot

InfoBeforeLabel=...
InstallingLabel=...
PreparingDesc=...
SelectComponentsDesc=...
SelectDirDesc=...
SelectTasksDesc=...
UninstallStatusLabel=...

SelectLanguageTitle={#MyAppName}
SelectLanguageLabel=Please select a language.%nВыберите язык установщика.
WizardInfoBefore=Особенности релиза
WizardSelectTasks=Выбор задачь

SelectDirLabel3=Программа установит [name] в следующую папку. Чтобы установить приложение в другую папку, нажмите кнопку 'Обзор' и укажите ее.%n%nПожалуйста, обратите внимание, что во время деинсталляции указанная папка будет удалена вместе со всем её содержимым.%n%nНажмите 'Далее' или 'Распаковать', чтобы продолжить.
SelectTasksLabel2=Выберите дополнительные задачи, которые должны выполниться при установке [name], после этого нажмите 'Установить':

[Ini]
Filename: {app}\AIMP.ini; Section: System; Key: UserMode; String: 0; Components: AIMP\P;
Filename: {app}\AIMP.ini; Section: System; Key: UserMode; String: 1; Components: AIMP\I;
Filename: {app}\AIMP.ini; Section: System; Key: BlockAssociations; String: 1; Components: AIMP\P;
Filename: {app}\AIMP.ini; Section: System; Key: BlockAssociations; String: 0; Components: AIMP\I;
Filename: {app}\AIMP.ini; Section: System; Key: DefaultLang; String: russian.lng; Languages: R;
Filename: {app}\AIMP.ini; Section: System; Key: DefaultLang; String: english.lng; Languages: E;
Filename: {app}\AIMP.ini; Section: System; Key: DefaultLang; String: ukrainian.lng; Languages: U;
Filename: {app}\AIMP.ini; Section: System; Key: Version; String: 4000;

Filename: {app}\Profile\AIMP.ini; Section: System; Key: LangFile; String: russian.lng; Components: AIMP\P; Languages: R;
Filename: {app}\Profile\AIMP.ini; Section: System; Key: LangFile; String: english.lng; Components: AIMP\P; Languages: E;
Filename: {app}\Profile\AIMP.ini; Section: System; Key: LangFile; String: ukrainian.lng; Components: AIMP\P; Languages: U;

Filename: {app}\Profile\AIMP-ContextMenu.ini; Section: Menu; Key: Lang; String: russian.lng; Components: AIMP\P; Languages: R;
Filename: {app}\Profile\AIMP-ContextMenu.ini; Section: Menu; Key: Lang; String: english.lng; Components: AIMP\P; Languages: E;
Filename: {app}\Profile\AIMP-ContextMenu.ini; Section: Menu; Key: Lang; String: ukrainian.lng; Components: AIMP\P; Languages: U;

Filename: {userappdata}\AIMP\AIMP.ini; Section: System; Key: LangFile; String: russian.lng; Components: AIMP\I; Languages: R;
Filename: {userappdata}\AIMP\AIMP.ini; Section: System; Key: LangFile; String: english.lng; Components: AIMP\I; Languages: E;
Filename: {userappdata}\AIMP\AIMP.ini; Section: System; Key: LangFile; String: ukrainian.lng; Components: AIMP\I; Languages: U;

Filename: {userappdata}\AIMP\AIMP-ContextMenu.ini; Section: Menu; Key: Lang; String: russian.lng; Components: AIMP\I; Languages: R;
Filename: {userappdata}\AIMP\AIMP-ContextMenu.ini; Section: Menu; Key: Lang; String: english.lng; Components: AIMP\I; Languages: E;
Filename: {userappdata}\AIMP\AIMP-ContextMenu.ini; Section: Menu; Key: Lang; String: ukrainian.lng; Components: AIMP\I; Languages: U;
Автор: ultimo
Дата сообщения: 19.01.2016 15:26
Habib2302
а если добавить в секцию Setup:

CloseApplications=no

?

Добавлено:
Habib2302
справка очень помогает, кстати. F1 в редакторе, и по ключевым словам

Оказывается, ShouldSkipPage не работает со страницами wpWelcome, wpPreparing, wpInstalling

Так что CloseApplications=no должен помочь
Автор: MihailM
Дата сообщения: 19.01.2016 23:50

Цитата:
sjwrec
Ну попробуйте в функции заменить String на AnsiString

Попробовал , все равно ругается .. Что за фигня не могу понять - аж ругаться уже хочется

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758

Предыдущая тема: Только инсталлятор


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.