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

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

Автор: Victor_Dobrov
Дата сообщения: 04.02.2008 00:47
alftair, Как убрать "Проверку минимальных системных требований" в InnoSetup Upgrade?
Никак, скрипт для этого и создан, а в Короне можно удалить строку #define Requirements...
Автор: RusDiego
Дата сообщения: 04.02.2008 13:19
Здравствуйте!

А не подскажет ли кто-нибудь, как проверить в папке приложения, версию главного исполняемого файла, так, чтобы если версия выше определенной, но ниже указанной, инсталятор разрешил обновить приложение, а если версия ниже определенной, выдал совет: Установите последние обновления перед установкой и завершил работу.
Нашел вот такое:

Support function: GetVersionNumbers
Образец:
function GetVersionNumbers(const Filename: String; var VersionMS, VersionLS: Cardinal): Boolean;
Описание:
Определяет номер версии указанного файла

Но не понял, как это можно использовать.
И где можно подсмотреть примерчик.

Спасибо!
Всего, Вам доброго.
Сергей.
Автор: Victor_Dobrov
Дата сообщения: 04.02.2008 16:08
Corona Skin & Check System Requirements (454 Кб в архиве) - расширение инсталлятора Inno Setup.

Доработка по просьбе iTASmania_Inc: В #define SkinPath можно указывать относительный путь к папке Corona.
Автор: PSKOVMAIL
Дата сообщения: 04.02.2008 18:22
Помогите вот с такой проблемой на картинке всё написано!!!


RusDiego
Что то подобное!???

Код: function NextButtonClick(CurPage: Integer): Boolean;
var
sz:Integer;
s:string;
begin
Result:=True;
If CurPage=6 then
//Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения
begin
If (FileSearch('Main.exe', ExpandConstant('{app}'))='')
or (FileSearch('Comp.dll', ExpandConstant('{app}')+'\data')='')
then
begin
s:='Извините, в директории '+ExpandConstant('{app}')+'' #13 'не обнаружены файлы, подтверждающие подлинность программы.' #13#13 'Пожалуйста, выберите правильный путь для установки обновления.';
MsgBox(s, mbError, mb_Ok);
Result:= False
end
else
//И проверка размера оригинальных файлов
begin
If FileSize(ExpandConstant('{app}')+'\Main.exe', sz)
then
begin
If sz<>270336 //Проверяемый размер в байтах
then
begin
s:='Размер установленого компонента Main.exe не соответствует.' #13#13 'Для установки обновления требуются оригинальные файлы.'; MsgBox(s, mbCriticalError, mb_Ok);
Result:= False
end else
begin
If FileSize(ExpandConstant('{app}')+'\data\Comp.dll', sz)
then
begin
If sz<>3688328
then
begin
s:='Размер установленого компонента Comp.dll не соответствует.' #13#13 ' Для установки обновления требуются оригинальные файлы.'; MsgBox(s, mbCriticalError, mb_Ok);
Result:= False
end;
end;
end;
end;
end;
end;
end;
Автор: iTASmania_Inc
Дата сообщения: 04.02.2008 18:48
Панелька убирается следующей строкой:
WizardForm.Bevel.Visible := False;
Только нет смысла её убирать, поскольку прогресс-бар невидим по другой причине: [more=подробнее]
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program

[Code]
procedure InitializeWizard();
begin
// WizardForm.Bevel.Visible := False;
WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top;
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.ProgressGauge.Width / 2;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInstalling then WizardForm.ProgressGauge.Show
else WizardForm.ProgressGauge.Hide;
end;
[/more]...
Автор: alftair
Дата сообщения: 04.02.2008 19:02
Victor_Dobrov, тогда такой вопрос. Как сделать тоже самое что в InnoSetup Upgrade только без "Проверки минимальных системных требований" ?? Переделать Корону ? Тогда как в Короне можно убрать страницу "Информация о пользователе"
Автор: iTASmania_Inc
Дата сообщения: 04.02.2008 19:56
alftair
Сказать "RTFM!", значит, ничего не сказать.

Цитата:
убрать страницу "Информация о пользователе"

В секции [Setup] замените UserInfoPage=true на UserInfoPage=false

Цитата:
кнопку "Справка" (в левом нижнем углу)

Удалите строку, начинающуюся #define EnableSplash ...
P.S.: перед тем, как задать следующий вопрос, пожалуйста, прочтите ReadMe.rtf и все комментарии (их там не так уж и много) в Corona Skin - уверен, на следующие вопросы там тоже найдутся ответы.
Автор: iTASmania_Inc
Дата сообщения: 04.02.2008 22:11
RusDiego
Могу предложить пример для ISCC.exe в директории Inno (необходим установленный препроцессор).
[more=Подробнее]
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program

[Code]
const
MINVERSION = '0.9.9.9'; // Минимальная версия файла 'ISCC.exe' (1.0.0.0) в директории Inno Setup

function InitializeSetup(): Boolean;
var
Version, ResultStr: String;
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup 5_is1',
'InstallLocation', ResultStr) then
begin
GetVersionNumbersString(ResultStr + 'ISCC.exe', Version);
if Version < MINVERSION then
MsgBox('Установите последние обновления перед установкой!', mbInformation, mb_Ok)
else
begin
MSgBox('Всё пучком! Установка разрешена!', mbInformation, mb_Ok);
Result := True;
end
end
else
MsgBox('Не найдены файлы программы!', mbInformation, mb_Ok);
end;
[/more].
Автор: PSKOVMAIL
Дата сообщения: 05.02.2008 00:19
iTASmania_Inc
Может поможешь с реализацией вот этого:


Хотелось бы слайд-шоу из 5-10 картинок в формате любом на странице wpInstalling со смещением progressbar вниз!


Код:
procedure InitializeWizard();
begin
// WizardForm.Bevel.Visible := False;
WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top;
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.ProgressGauge.Width / 2;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInstalling then WizardForm.ProgressGauge.Show
else WizardForm.ProgressGauge.Hide;
end;
Автор: VinogradOFF
Дата сообщения: 05.02.2008 12:27
Здраствуйте, у меня к вам вопросик)) подскажите как с помощью инно сделать следующий замут -->
Происходит действие Унинсталл) Необходимо открыть Урл в браузере (неважно каком). Но не просто открыть, а сделать так чтобы код, который идёт после вызова УРЛ начинал исполнятся только после закрытия странички юзером. Буду рад любым советам.
Я пробовал с помощью функции ShellExec:

ShellExec('open',UnUnstallURL,'','', SW_Shownormal,ewWaitUntilterminated,ErrorCode);
Автор: iTASmania_Inc
Дата сообщения: 05.02.2008 15:34
VinogradOFF

Цитата:
Я пробовал с помощью функции ShellExec

Всё правильно, только непонятно, почему у Вас не работает. Можно весь код?
Автор: VinogradOFF
Дата сообщения: 05.02.2008 16:47

Вот по сути весь код ))

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
    ErrorCode: Integer;
begin
case CurUninstallStep of
    usPostUninstall :
        begin
ShellExec('open','Google.com','','', SW_Shownormal,ewWaitUntilterminated,ErrorCode);
end;
end;
end;

Добавлено:
проблема в том что как только кидает на сайт - сразу предлагает унинсталл ребутнутся, т.к. ещё есть процедура

function UninstallNeedRestart(): Boolean;
begin
Result := True;
end;

А возможно ли сделать так, что это предложение будет после того как страничка в браузере будет закрыта?
Автор: iTASmania_Inc
Дата сообщения: 05.02.2008 17:07
PSKOVMAIL
[more=Подробнее]
#define TIME_FOR_VIEW 1

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
OutputBaseFileName=Timer_with_InnoCallback.dll
OutputDir={#SourcePath}

[Files]
Source: InnoCallback.dll; Flags: dontcopy;

[Code]
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
TimerID: LongWord;
currTime: Integer;
SplashImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
case currTime of
{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{src}\Image_2.bmp')) end;
2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{src}\Image_3.bmp')); KillTimer(0, TimerID); end;
end;
end;

procedure InitializeWizard();
begin

currTime := 0;

WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top;
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.ProgressGauge.Width / 2;
WizardForm.ProgressGauge.Hide;

WizardForm.StatusLabel.Hide;
WizardForm.FilenameLabel.Hide;

SplashImage := TBitmapImage.Create(WizardForm);
SplashImage.Top := 0;
SplashImage.Left := 0;
SplashImage.Width := WizardForm.MainPanel.Width;
SplashImage.Height := WizardForm.Bevel.Top;
SplashImage.Parent := WizardForm.InnerPage;
SplashImage.Stretch := True;
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{src}\Image_1.bmp'));
SplashImage.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;

begin

if (CurPageID = wpInstalling) then
begin
pfunc := WrapTimerProc(@OnTimer, 4);
TimerID := SetTimer(0, 0, 1000, pfunc);

WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;

WizardForm.ProgressGauge.Show;
SplashImage.Show;
end
else
begin
WizardForm.ProgressGauge.Hide;
SplashImage.Hide;

if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
begin
WizardForm.InnerNotebook.Show;
WizardForm.Bevel1.Show;
WizardForm.MainPanel.Show;
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
end;

end;

end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;
[/more]...
Здесь пример для 3-х картинок, остальные, думаю, можно дописать без проблем.
В папку с интсаллом необходимо поместить три bmp: Image_1.bmp, Image_2.bmp, Image_3.bmp --> из них будет строиться слайдшоу, растягиваясь на указанную Вами область. Интервал смены картинок - в макроопределении TIME_FOR_VIEW.
Хотя лучше делать не по таймеру, а по положению прогрессбара... ИМХО!
Автор: alftair
Дата сообщения: 05.02.2008 20:14
InnoSetup_CoronaSkin_and_System_Test

Это баг или нет?
В файле "Corona.iss" удаляем строку "#define EnableMusic true ;" и "#define EnableSystemTest true ;". Теперь в секции [Setup] переименовываем "AppName=Corona" во что угодно, после этого выдается ошибка при сборке:


Compiler Error:
File: Corona_kernel.iss
Line 917:
Column: 2:
Syntax Error.
Автор: Kutsenko
Дата сообщения: 05.02.2008 20:38
2 iTASmania_Inc
А можете подкоректировать ваш скрипт с теми 3 картинками (2 поста перед моим) чтобы картинки показывались по процентам прогресбара?
Автор: iTASmania_Inc
Дата сообщения: 05.02.2008 21:29
Kutsenko
Подобный пример решения (от Samprona) уже не раз мелькал в теме (и не только в этой ветке).
[more=Подробнее]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
OutputBaseFileName=Timer_with_InnoCallback.dll
OutputDir={#SourcePath}

[Files]
Source: InnoCallback.dll; Flags: dontcopy;
Source: {src}\06.ape; DestDir: {app}; Flags: external;
Source: {src}\Копия 06.ape; DestDir: {app}; Flags: external;


[Code]
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
TimerID: LongWord;
currTime: Integer;
SlideImage: TBitmapImage;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

function PercentProgress(): Integer;
begin
with WizardForm.ProgressGauge do
Result := (Position-Min)/((Max - Min)/100);
end;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin

if (PercentProgress>20) and (PercentProgress<40) and (SlideImage.Tag<>1) then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{src}\Image_2.bmp'));
SlideImage.Tag := 1;
end
else
if (PercentProgress>40) and (PercentProgress<60) and (SlideImage.Tag<>2) then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{src}\Image_3.bmp'));
SlideImage.Tag := 2;
end

end;

procedure InitializeWizard();
begin

currTime := 0;

WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top;
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.ProgressGauge.Width / 2;
WizardForm.ProgressGauge.Hide;

WizardForm.StatusLabel.Hide;
WizardForm.FilenameLabel.Hide;

SlideImage := TBitmapImage.Create(WizardForm);
SlideImage.Top := 0;
SlideImage.Left := 0;
SlideImage.Width := WizardForm.MainPanel.Width;
SlideImage.Height := WizardForm.Bevel.Top;
SlideImage.Parent := WizardForm.InnerPage;
SlideImage.Stretch := True;
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{src}\Image_1.bmp'));
SlideImage.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;

begin

if (CurPageID = wpInstalling) then
begin
pfunc := WrapTimerProc(@OnTimer, 4);
TimerID := SetTimer(0, 0, 100, pfunc);

WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;

WizardForm.ProgressGauge.Show;
SLideImage.Show;
end
else
begin
WizardForm.ProgressGauge.Hide;
SLideImage.Hide;

if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
begin
WizardForm.InnerNotebook.Show;
WizardForm.Bevel1.Show;
WizardForm.MainPanel.Show;
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
KillTimer(0, TimerID);
end;

end;

end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;
[/more].

VinogradOFF
C открытием страниц в интернете ewWaitUntilTerminated ставить бесполезно, как выход: открывать сайт через определённый браузер либо открывать сохранённый на диске файл.
Автор: PSKOVMAIL
Дата сообщения: 05.02.2008 21:32

Цитата:
PSKOVMAIL
Подробнее...
Здесь пример для 3-х картинок, остальные, думаю, можно дописать без проблем.
В папку с интсаллом необходимо поместить три bmp: Image_1.bmp, Image_2.bmp, Image_3.bmp --> из них будет строиться слайдшоу, растягиваясь на указанную Вами область. Интервал смены картинок - в макроопределении TIME_FOR_VIEW.
Хотя лучше делать не по таймеру, а по положению прогрессбара... ИМХО!


Спасибо огромное за помощь, всё как я хотел, но есть пару вопросов:
1) Как сделать чтобы слайдшоу повторялось?
2) Как перенести StatusMsg туда же где и прогрессбар?
Автор: iTASmania_Inc
Дата сообщения: 05.02.2008 21:46
PSKOVMAIL

Цитата:
Как сделать чтобы слайдшоу повторялось?

Изменить OnTimer, [more=подробнее]procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
case currTime of
0: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{src}\Image_1.bmp')); end;
{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{src}\Image_2.bmp')); end;
2*{#TIME_FOR_VIEW}: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{src}\Image_3.bmp')); end;
end;
if CurrTime = 2*{#TIME_FOR_VIEW} then CurrTime := -1;
end;
[/more].

Добавлено:

Цитата:
Как перенести StatusMsg туда же где и прогрессбар?

StatusLabel? Парадоксально, но аналогично прогрессбару.
В InitializeWizard пишется [more=это]
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(9);
WizardForm.StatusLabel.Parent := WizardForm;
WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
WizardForm.StatusLabel.Left := ScaleX(10);
WizardForm.StatusLabel.Hide;
[/more], ну и в CurPageChanged "показываем" и "прячем" так же, как и ProgressGauge.
Автор: PSKOVMAIL
Дата сообщения: 05.02.2008 22:23
iTASmania_Inc

Всё разобрался ещё раз огромное СПАСИБО!
Автор: Victor_Dobrov
Дата сообщения: 06.02.2008 01:40
alftair, это у вас баг , вернее очень старый исходник Corona Skin.
Вы не читаете форум, эти ключи заменены на #define MediaPlayer "путь" и #define Requirements "мин. треб".
Автор: Chanka
Дата сообщения: 06.02.2008 08:13
Помогите, пожалуйста, разобраться. Надо в зависимости от того какой язык использует инно сетап сделать чтобы и в секции код MsgBox сообщения были на таком же языке.

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl";
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl";

[CustomMessages]
TextEN=English
TextRU=Russian

Кто-то когда-то делал уже подобное да вот только найти не могу
Автор: RusDiego
Дата сообщения: 06.02.2008 08:41

Цитата:
[/q]
[q]iTASmania_Inc

RusDiego
Могу предложить пример для ISCC.exe в директории Inno (необходим установленный препроцессор).
Подробнее.

----------
/* Corona Skin is my FAVOURITE skin for Inno Setup! Must be and must have! */


Огромное спасибо!
Все работает.
Автор: iTASmania_Inc
Дата сообщения: 06.02.2008 09:40
Chanka
Поиск в правом верхнем углу рулит (или Ctrl + F по всему топику ):
http://forum.ru-board.com/topic.cgi?forum=5&topic=23235&start=740#16
http://forum.ru-board.com/topic.cgi?forum=5&topic=23235&start=1905&limit=1&m=1#1
Автор: Chanka
Дата сообщения: 06.02.2008 09:52
iTASmania_Inc

СЕНК Ю
Автор: Ruud
Дата сообщения: 06.02.2008 11:44
Здравствуйте,у меня вопрос к знатокам Inno.В руководстве Kindly описывается проверка на присутствие и целостность определенного файла, находящего рядом с инсталлятором.Возможно ли средствами Inno сделать привязку инсталлятора к метке CD или DVD носителя?
Автор: VinogradOFF
Дата сообщения: 06.02.2008 12:16

Цитата:
C открытием страниц в интернете ewWaitUntilTerminated ставить бесполезно, как выход: открывать сайт через определённый браузер либо открывать сохранённый на диске файл.


Окей ) а как тогда открыть через определённый браузер с использованием ewWaitUntilTerminated?
Автор: iTASmania_Inc
Дата сообщения: 06.02.2008 23:37
[Удалено автором, не догадавшимся поглядеть MSDN поленившимся почитать Help ]
Автор: JHeavy
Дата сообщения: 08.02.2008 20:07
Скажите пожалуйста, как растянуть горизонтально картинку, которая имеет размер 55*55? Соррь, если этот вопрос уже задавался...
Автор: alftair
Дата сообщения: 08.02.2008 22:26
Можно ли сделать чтобы выходной файл (например - setup.exe) не вбирал в себя те файлы которые он будет устанавливать, а было бы так чтобы инсталлятор был отдельно а рядом лежали установочные файлы? Че-то в спраки не нашел этого.
Автор: iTASmania_Inc
Дата сообщения: 08.02.2008 22:34
alftair
Значит, невнимательно читали --> используйте флаг external.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Поиск в WinDjView


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