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

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

Автор: EagleSH
Дата сообщения: 05.06.2008 15:55
SotM

Цитата:
1. Запуститься инно
2. Запуститься из него сторонний exe
3. Можно ждать до окончания работы стороннего exe, а можно чтоб он параллельно делал дело.

да это я в курсе, думал мож мона так, как справшивал.
спс.
Автор: antifire
Дата сообщения: 05.06.2008 15:56
SotM

=) Попробую - риск дело благородное...

Добавлено:
Genri
SotM
htuos

Огромное спасибо за помощь - установщик завершен благодаря вам!
Автор: Diawer
Дата сообщения: 05.06.2008 16:47
[more=Твой код] [Files]
Source: icon.ico; DestDir: {tmp}; Flags: dontcopy

[Code]
function LoadImage(hInst: THandle; ImageName: PChar; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle; external 'LoadImageA@user32.dll stdcall delayload';

procedure InitializeWizard;
begin
ExtractTemporaryFile('icon.ico');
SendMessage(WizardForm.Handle, $0080, 0, LoadImage(0,ExpandConstant('{tmp}')+'\icon.ico',1,16,16,$1010));
end;[/more] классный, но помоги довести его до идеала, а именно в окнах деисталлятора он не катит, мало того там просто иконки нет.

Автор: Genri
Дата сообщения: 05.06.2008 16:47
antifire

Цитата:
установщик завершен
-- типа устал? А если [more=так]
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My_Programm

[Files]
Source: MyProg.exe; DestDir: {app}
Source: MyDll.dll; DestDir: {app}
Source: MyProg.chm; DestDir: {app}; AfterInstall: CopyDataFiles()

[_Code]
var
MaxSlice, CurrentSlice: integer;

function GetMaxSlice(): integer;
var
FS: TFileStream;
str: string;
begin
str:= StringOfChar(' ', 1);
FS := TFileStream.Create(ExpandConstant('{app}\MyProg.exe'), fmOpenRead);
try
FS.Seek(4,soFromBeginning);
FS.ReadBuffer(str, 1);
Result:=Ord(str[1]);
finally
FS.Free;
end;
end;

procedure DeleteDataFiles();
var
CurrentFile: string;
begin
while CurrentSlice > 0 do
begin
CurrentFile:= Format('DATA.%.3d', [CurrentSlice]);
DeleteFile(ExpandConstant('{app}\' + CurrentFile));
CurrentSlice:= CurrentSlice-1;
end;
end;

procedure CopyDataFiles();
var
CurrentFile: string;
begin
MaxSlice:= GetMaxSlice();
CurrentSlice:= 1;
while CurrentSlice <= MaxSlice do
begin
CurrentFile:= Format('DATA.%.3d', [CurrentSlice]);
WizardForm.FilenameLabel.Caption:= CurrentFile;
if FileCopy(ExpandConstant('{src}\' + CurrentFile),
ExpandConstant('{app}\' + CurrentFile), False) then
CurrentSlice:= CurrentSlice+1
else
if MsgBox('Вставьте диск №' + IntToStr(CurrentSlice) +
' или нажмите Отмена для прекращения установки',
mbInformation, MB_RETRYCANCEL) = IDCANCEL then
if ExitSetupMsgBox then
begin
DeleteDataFiles();
WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
Break;
end;
end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then
Confirm:= False;
end; [/more]?
Автор: Diawer
Дата сообщения: 05.06.2008 16:48
htuos


Добавлено:
htuos
Автор: htuos
Дата сообщения: 05.06.2008 19:24
Diawer
чтобы в анинстале поменять иконку тебе ее придется где-то сохранять и подгружать с этого места, [more=например так][Files]
Source: icon.ico; DestDir: {app}; Flags: ignoreversion

[Code_]
procedure InitializeUninstallProgressForm();
begin
SendMessage(UninstallProgressForm.Handle, $0080, 1, LoadImage(0,ExpandConstant('{app}')+'\icon.ico',1,16,16,$1010));
end;[/more]

Sampron
судя по всему быстрее картинку повернуть не получится (возможно есть WinAPI-шные функции, но я не знаю какие или длл сторонняя) и код чуток [more=переписал]
#define MyAppName "My Program"
#define MyAppVerName "My Program 1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "MyProg.exe"

[Setup]
AppId={{E071B2C4-617B-4C37-9097-F74C81AEEF70}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
WizardImageFile=bitmap.bmp

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Code_]

procedure FlipBitmap(Bitmap:TBitmap;FlipHor:boolean);
var
x,y,W,H:integer;
mp:TColor;
begin
W:=Bitmap.Width-1;
H:=Bitmap.Height-1;
if FlipHor then
for y:=0 to H do
for x:=0 to W div 2 do begin
mp:=Bitmap.Canvas.Pixels[x,y];
Bitmap.Canvas.Pixels[x,y]:=Bitmap.Canvas.Pixels[W-x,y];
Bitmap.Canvas.Pixels[W-x,y]:=mp;
end
else
for y:=0 to H div 2 do
for x:=0 to W do begin
mp:=Bitmap.Canvas.Pixels[x,y];
Bitmap.Canvas.Pixels[x,y]:=Bitmap.Canvas.Pixels[x,H-y];
Bitmap.Canvas.Pixels[x,H-y]:=mp;
end;
end;

procedure HorButtonClick(Sender: TObject);
begin
FlipBitmap(WizardForm.WizardBitmapImage.Bitmap,True);
WizardForm.WizardBitmapImage.Invalidate;
end;

procedure VertButtonClick(Sender: TObject);
begin
FlipBitmap(WizardForm.WizardBitmapImage.Bitmap,False);
WizardForm.WizardBitmapImage.Invalidate;
end;

procedure InitializeWizard;
begin
with TButton.Create(WizardForm) do begin
Parent:=WizardForm;
Caption:='отразить горизонтально';
Width:=140;
Height:=20;
Left:=10;
Top:=WizardForm.Height-75;
OnClick:=@HorButtonClick;
end;
with TButton.Create(WizardForm) do begin
Parent:=WizardForm;
Caption:='отразить вертикально';
Width:=140;
Height:=20;
Left:=10;
Top:=WizardForm.Height-55;
OnClick:=@VertButtonClick;
end;
end;[/more]
смысл тот же, переворачиваем попиксельно, работать по идее должно немного быстрее, но не заметно что-то. Со ScanLine'ом работает намного быстрее (перерисовки не заметно), но как я понял Inno Setup не работает с указателями, поэтому и ScanLine'a видимо нету. если придумаешь что получше, выложи код, интересно посмотреть как реализуешь
Автор: braunberg
Дата сообщения: 06.06.2008 02:45
Diawer

Цитата:
мало того там просто иконки нет

А когда она там была?

htuos
Можно ли сделать так, чтобы картинка плавно перерисовывалась (исчезала) открывая фон, от верхнего левого пикселя к нижнему правому, или построчно (1-3px) сверху вниз? Или это очень сложно?
Автор: AlexDJ666
Дата сообщения: 06.06.2008 08:12
Genri, спасибо большое, действительно, ошибка была в одинаковых переменных. Теперь все нормально.

По поводу увеличенного скриншота не подскажешь?

И еще вопрос, а как можно сделать в ListBox проверку "элемента под мышью", если появляется строка прокрутки?

Добавлено:
И еще один момент забыл. Если в ListBox'е есть родительские элементы, то при нажатии на такой элемент выделение с дочерних снимается, а вот при повторном нажатии все дочерние не выделяются. Это можно как-то исправить?
Автор: antifire
Дата сообщения: 06.06.2008 08:26
Genri

Я попроще сделал

WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
if ExitSetupMsgBox then
begin
    DelTree(ExpandConstant('{app}'), True, True, True);
    Break;
end;

Может быть и грубовато - зато работает. =) А как окно установки активным всегда сделать, может поверх всех окон или что-то в этом роде? При копировании файлов DATA оно виснет...
Автор: dron0000
Дата сообщения: 06.06.2008 10:02
Подскажите как реализовать следующее:
При начале установки (после указания папки установки) выводить окно в котором пользователю необходимо будет ввести некоторые данные, например IP адрес сервера. Это значение должно записаться в определенный файл и соответственно скопироваться в определенное место на компьютере пользователя.

Можно ли реализовать такую схему?
Автор: RedGeek
Дата сообщения: 06.06.2008 10:19
Как сделать так, чтобы галочки стояли по-умолчанию, т.е. чекнуты были:
[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: quicklaunchicon
Автор: Pahan92
Дата сообщения: 06.06.2008 11:27
Inno Setup Unpacker не справляется с последней Inno Setup!!!
Автор: SotM
Дата сообщения: 06.06.2008 11:52
Pahan92
Приехали... Это ты спрашиваешь или говоришь?!
Здесь уже говорили об этом, читай предыдущие страницы.

RedGeek
Где именно чекнуты были?!
В примерах можно посмотреть этот файл: Components.iss
Также в других скриптах можно глянуть, и в хелпе тоже.

dron0000
Посмотри в сторону CreateCustomPage.
В примерах также: CodeClasses.iss, Setup.iss

RTFM как говорится.
Автор: AlexDJ666
Дата сообщения: 06.06.2008 11:56
И еще вопросик.
У меня в инсталляторе получается 14 нарисованных страниц (рисовка через PageХ:=CreateCustomPage(Х, 'Название', 'Описание.'), где Х - номер страницы от 1 до 14), но между 5 и 6 страницей вклинивается страница с выбором директории (wpSelectDir, кажется), а вместо 10-й появляется страница готовности к установке (wpReady, кажется) и остальные не показываются
Как сделать так, чтобы wpSelectDir, wpReady, wpInstalling и wpFinished появлялись уже после моих рисованных страниц? Рисовать их самому с номерами 15, 16, 17 и 18 или как?
Автор: dron0000
Дата сообщения: 06.06.2008 12:13
SotM: Спасибо. Как создавать поле разобрался. А как передать значение из переменной в определенный файл, и этот файл скопировать в определенную папку.
Автор: SotM
Дата сообщения: 06.06.2008 12:41
AlexDJ666
Вклинивается wpSelectDir потому что у него наверное такой номер
А ты пробовал свои страницы нумеровать скажем начиная от 100?

dron0000
Ну дык, в примерах же есть такое, да и спрашивали здесь это раньше:
SaveStringToFile
FileCopy
Автор: AlexDJ666
Дата сообщения: 06.06.2008 12:46
SotM, примерно так я и подумал
Тогда другой вопрос, а как изменить номер у страниц wpSelectDir, wpReady, wpInstalling и wpFinished? Ведь, если я поставлю номера своим страницам начиная от 100, то все эти страницы будут перед моими, или я неправильно понимаю?
Автор: Pahan92
Дата сообщения: 06.06.2008 12:48
SotM
Говорится говорилось но толком не чё там не было.Я спрашиваю ктонить смог распоковать Inno Setup Unpacker Inno Setup 5.2.3?
Автор: SotM
Дата сообщения: 06.06.2008 13:15
AlexDJ666
А зачем у wpSelectDir, wpReady, wpInstalling и wpFinished менять номера?!
Блин, когда ж инструкцию то читать все будут!
Смотри пример CodeClasses.iss, а там procedure CreateTheWizardPages, проще уже не куда...

Pahan92
У меня всё прекрасно распаковалось! Так что я не знаю, что и куда там у тебя не распаковывается.
Автор: Pahan92
Дата сообщения: 06.06.2008 13:30
SotM
Я пытаюсь при помощи Total Commander и он не распаковывает.

Добавлено:
SotM
Я пытаюсь при помощи Total Commander и он не распаковывает.
Автор: SotM
Дата сообщения: 06.06.2008 13:38
Pahan92
дык, тогда ты неправильно спросил, сначала правильно описывай ситуацию и конкретно задавай вопрос. А то ты сказал "у меня тут что-то не работает".
Сам innounp нормально распаковывает, значит проблема не в нём. Я сам FARом пользуюсь, но я и не пытаюсь через него что-то распаковать.
И я так понимаю, что тебе лень было посмотреть несколько страниц назад.
Найди пост датированный: 03-05-2008, там есть ссылка.
Автор: Raf_SE
Дата сообщения: 06.06.2008 13:43
А можно ли сделать чтобы если юзер выбрал компонент "Text\rus\Buka", то в период инсталяции, как только распаковывается файл "W32ART.POD", инсталляция приостанавливалась, и запускался бы
Filename: "{app}\W32ART_POD_VPatch.exe"; Parameters: """{app}\W32ART.POD"" ""{app}\W32ART.POD_new"""; StatusMsg: "{cm:W32ART_POD}"; Components: Text\rus\Buka
Ну а после завершения его работы, инсталляция (распаковка файлов) продолжилась бы.
Автор: SotM
Дата сообщения: 06.06.2008 13:48
Raf_SE
Ты как-то сложно всё спрашиваешь.
Нельзя ли этот патч запустить сразу после распаковки всех файлов?
Или его нужно прямо посередине процесса распаковки запустить?
Автор: Raf_SE
Дата сообщения: 06.06.2008 14:02
SotM
Дело в том, что он кривоват. Он не патчит оригинальный файл, а создает новый, на его основе + добавляет свои данные. Так вот, этот файл весит почти 2 Гб. Если патч запустить после распаковки всех файлов, тогда юзеру нужно будет иметь дополнительных 2 Гб на винчестере.
Ах да, забыл, сразу после патча нужно будет чтобы W32ART.POD удалялся.
Автор: SotM
Дата сообщения: 06.06.2008 14:16
Raf_SE
Хммм, ну тогда придется извращаться с помощью фичи AfterInstall.

Пример 1. Когда изначально ты "отделяешь" свой чудо файл от остальных.

Код:
[Files]
Source: "W32ART.POD"; DestDir: "{app}"; AfterInstall: MyAfterInstall

[no]
Код: [/no]
procedure MyAfterInstall();
var
ResultCode: Integer;
begin
Exec(ExpandConstant('{app}\W32ART_POD_VPatch.exe'), ExpandConstant( CurrentFileName ) +
ExpandConstant( ' {app}\W32ART.POD_new' ), '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
DeleteFile( ExpandConstant( CurrentFileName ) );
end;
Автор: Raf_SE
Дата сообщения: 06.06.2008 14:27
SotM
Пока не тестил. Но
1. Файл будет находиться среди куче других (маленьких).
2. Без подсказок патч не поймет что ему делать. Нужно чтобы он запускался с параметром либо ""{app}\W32ART.POD" "{app}\W32ART.POD_new"" либо просто "W32ART.POD W32ART.POD_new".
Автор: SotM
Дата сообщения: 06.06.2008 14:37
Raf_SE
Пробуй

Цитата:
Без подсказок патч не поймет что ему делать. Нужно чтобы он запускался с параметром либо ""{app}\W32ART.POD" "{app}\W32ART.POD_new"" либо просто "W32ART.POD W32ART.POD_new".

А разве я этого в коде не учёл?! Вроде там всё ясно.

Автор: Raf_SE
Дата сообщения: 06.06.2008 15:29
SotM
Патч пишет ошибку, о том что его неправильно попросили. (пробывал второй код)


Цитата:
А разве я этого в коде не учёл?! Вроде там всё ясно.

Я этого не увидел. Буду благодарен если ткнешь носом. (ну не шарю я в паскалях)
Автор: Genri
Дата сообщения: 06.06.2008 15:43
AlexDJ666

Цитата:
Если в ListBox'е есть родительские элементы, то при нажатии на такой элемент выделение с дочерних снимается, а вот при повторном нажатии все дочерние не выделяются. Это можно как-то исправить?
-- можно изменить процедуру [more=CheckOnClick]
procedure CheckOnClick (Sender: TObject);
begin
if MouseY < ListBox.Items.Count then
begin
if ListBox.Checked[MouseY] then
ListBox.CheckItem(MouseY, coUncheck)
else
ListBox.CheckItem(MouseY, coCheckWithChildren);
end;
end; [/more]
По поводу скриншота - это не ко мне (я с графикой не люблю возиться).
По поводу полосы прокрутки - может и можно что-нибудь придумать, но не думаю, что это хоршая мысль. Все чекбоксы должны быть видны без прокрутки. Иначе пользователь может не обратить внимание на скрытые опции.
По поводу порядка страниц - посмотри хелп на CreateCustomPage. Если вкратце: первый параметр определяет, после какой страницы будет отображена создаваемая. Например:
Page1:=CreateCustomPage(wpWelcome, .... - т.е. Page1 будет отображена после wpWelcome
Page2:=CreateCustomPage(Page1.ID, .... - т.е. Page2 будет отображена после Page1
...и т.д.

antifire

Цитата:
При копировании файлов DATA оно виснет...
-- может лучше использовать принципиально другой [more=механизм]

#define MaxSlicesCount 255
#define OneSliceSize 46368582
#define i

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program

[Files]
Source: MyProg.exe; DestDir: {app}
Source: MyDll.dll; DestDir: {app}
Source: MyProg.chm; DestDir: {app}

#sub AddFile
Source: {code:GetFileName|{#i}}; DestDir: {app}; Check: NeedSlice({#i}); BeforeInstall: SearchSlice({#i}); ExternalSize: {#OneSliceSize}; Flags: external
#endsub

#for {i = 1; i <= MaxSlicesCount; i++} AddFile

[_Code]
var
MaxSlice, CurrentSlice: integer;

function GetFileName(Param: string): string;
begin
Result:= ExpandConstant('{src}\') +
Format('DATA.%.3d', [StrToInt(Param)]);
end;

function NeedSlice(current: integer): Boolean;
begin
if current <= MaxSlice then Result:= True;
end;

procedure SearchSlice(Param: integer);
var
FileName: string;
FileFound: boolean;
begin
FileName:= GetFileName(IntToStr(Param));
FileFound:= FileExists(FileName);
while not FileFound do
begin
if MsgBox('Вставьте диск №' + IntToStr(Param) +
' или нажмите Отмена для прекращения установки',
mbInformation, MB_RETRYCANCEL) = IDRETRY then
FileFound:= FileExists(FileName)
else
if ExitSetupMsgBox then
begin
WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
Break;
end;
end;
end;

function GetMaxSlice(): integer;
var
FS: TFileStream;
str: string;
begin
str:= StringOfChar(' ', 1);
FS := TFileStream.Create(ExpandConstant('{src}\setup.exe'), fmOpenRead);
try
FS.Seek(8,soFromBeginning);
FS.ReadBuffer(str, 1);
Result:=Ord(str[1]);
finally
FS.Free;
end;
end;

procedure InitializeWizard();
begin
MaxSlice:= GetMaxSlice();
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then
Confirm:= False;
end; [/more]?

Автор: SotM
Дата сообщения: 06.06.2008 15:47
Raf_SE


Код: Exec( ExpandConstant('"{app}\W32ART_POD_VPatch.exe"'), ' "' + ExpandConstant( CurrentFileName ) + ExpandConstant( '" "{app}\W32ART.POD_new"' ), '', SW_SHOW, ewWaitUntilTerminated, ResultCode)

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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