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

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

Автор: Yekver
Дата сообщения: 18.05.2007 00:20
Genri

Спасибо большое, решение помогло.

У меня вопрос следующего содержания:
1 Как в процессе установки дописать в уже имеющийся в дистрибутиве ini-файл некоторые строки?
2. ip-адрес можно узнать только вытащив значение из реестра или ещё как-то?
Автор: Sampron
Дата сообщения: 18.05.2007 00:30
boss911

Цитата:
(с прозрачностью и до полной видимости)

http://forum.ru-board.com/topic.cgi?forum=5&topic=4801&start=2060#10
Автор: Genri
Дата сообщения: 18.05.2007 01:24
Yekver
1. Функций работы с ini-файлами достаточно много (см. Help - Pascal Scripting - Support Functions Reference).
2. Адрес можно узнать разными способами. Один из вариантов см. здесь

Раз решение помогло, получи [more=бонус]
Код: [Setup]
AppName=My Program
AppVerName=My Program ver.1.5
DefaultDirName={pf}\My Program

[Files]
Source: FBirdSetup.exe; Flags: dontcopy
Source: Files\*.bmp; DestDir: {app}

[Code]
var
FirebirdInst: TInputOptionWizardPage;
IsFbrInstalled: Boolean;

procedure InitializeWizard;
begin
IsFbrInstalled:= False;

FirebirdInst := CreateInputOptionPage(wpWelcome,
'Firebird 2.0', '', '', True, False);
FirebirdInst.Add('Установить');
FirebirdInst.Add('Уже установлен');
case GetPreviousData('FirebirdInst', '') of
'Установить': FirebirdInst.SelectedValueIndex := 0;
'Уже установлен': FirebirdInst.SelectedValueIndex := 1;
else
FirebirdInst.SelectedValueIndex := 0;
end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
ResultCode: Integer;
begin
Result:= True;
if (CurPageID = FirebirdInst.ID) and (FirebirdInst.Values[0]) then
begin
ExtractTemporaryFile('FBirdSetup.exe');
Exec(ExpandConstant('{tmp}\FBirdSetup.exe'), '', '', SW_SHOWNORMAL,
ewWaitUntilTerminated, ResultCode);
IsFbrInstalled:= True;
end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID = FirebirdInst.ID then
Result:= IsFbrInstalled
else
Result:= False;
end;

Автор: boss911
Дата сообщения: 18.05.2007 01:34
Sampron

Да, самое оно! Но я все же уповаю на то, чтоб плавно стартовал инстал со скином! Скажите, это реально, может кто-то заняться?
Автор: marat shakirov
Дата сообщения: 18.05.2007 08:04
А может кто нибудь вообще дать ссылку на материал, описывающий структуру и переменные стандартных страниц в Inno Setup. Чтобы лишний раз не спрашивать откуда и как выцарапать какую тот переменную или значение.

Спасибо
Автор: maxdddca123
Дата сообщения: 18.05.2007 08:14
marat shakirov
В шапке темы есть ссылки на хелп !
Автор: marat shakirov
Дата сообщения: 18.05.2007 10:11
Genri

Это немного не то, мне нужно получить размер места на диске, который нужен для выбранных компонентов. И пример кода у меня не заработал.
То есть из списка выбрана часть компонентов и Inno Setup пишет внизу страницы, сколько потребуется для них места. Где хранится это число, чтобы использовать его в дальнейшем?
Автор: drakula 666
Дата сообщения: 18.05.2007 10:48
народ можете помочь. у меня есть игра неустановленная я сделал ее пакет с записью в реестр, установил. все нормально работает. но обновление почему то не ставиться. пишет что инра не найдена. как поставить обновление?
Автор: Sero
Дата сообщения: 18.05.2007 14:20
boss911

Цитата:
К сожалению эфекты со скинами лучше не использовать, просто анимирутеса стандартный пустой диалог, а потом выскакивает сам инсталл! Кстати, чего-то у меня не один _OUT_ несработал, тоесть анимации ни какой не увидел!


[more=Исправил]

Код:
const
AW_FADE_IN = $00080000;
AW_FADE_OUT = $00090000;
AW_SLIDE_IN_LEFT = $00040001;
AW_SLIDE_OUT_LEFT = $00050002;
AW_SLIDE_IN_RIGHT = $00040002;
AW_SLIDE_OUT_RIGHT = $00050001;
AW_SLIDE_IN_TOP = $00040004;
AW_SLIDE_OUT_TOP = $00050008;
AW_SLIDE_IN_BOTTOM = $00040008;
AW_SLIDE_OUT_BOTTOM = $00050004;
AW_DIAG_SLIDE_IN_TOPLEFT = $00040005;
AW_DIAG_SLIDE_OUT_TOPLEFT = $0005000a;
AW_DIAG_SLIDE_IN_TOPRIGHT = $00040006;
AW_DIAG_SLIDE_OUT_TOPRIGHT = $00050009;
AW_DIAG_SLIDE_IN_BOTTOMLEFT = $00040009;
AW_DIAG_SLIDE_OUT_BOTTOMLEFT = $00050006;
AW_DIAG_SLIDE_IN_BOTTOMRIGHT = $0004000a;
AW_DIAG_SLIDE_OUT_BOTTOMRIGHT = $00050005;
AW_EXPLODE = $00040010;
AW_IMPLODE = $00050010;

function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): Boolean;
external 'AnimateWindow@user32 stdcall';

procedure OnShow(Sender: TObject);
begin
AnimateWindow(WizardForm.Handle,1000,AW_EXPLODE);
WizardForm.NextButton.OnClick(WizardForm.NextButton);
WizardForm.BackButton.OnClick(WizardForm.BackButton);
end;

procedure InitializeWizard();
begin
WizardForm.OnShow:=@OnShow;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
AnimateWindow(WizardForm.Handle,1000,AW_IMPLODE);
Cancel:=True;
end;
Автор: Genri
Дата сообщения: 18.05.2007 15:16
marat shakirov
Цитата:
мне нужно получить размер места на диске, который нужен для выбранных компонентов
-- тогда так:
Код:
function GetComponentSpace(): Currency;
var
ComponentSpace: string;
StartLen, EndLen, SpaceLen: integer;
begin
ComponentSpace:= SetupMessage(msgComponentsDiskSpaceMBLabel);
StartLen:= Pos('[', ComponentSpace);
EndLen:= Length(ComponentSpace) - Pos(']', ComponentSpace);
ComponentSpace:= WizardForm.ComponentsDiskSpaceLabel.Caption;
SpaceLen:= Length(ComponentSpace) - StartLen - EndLen + 2;
ComponentSpace:= Copy(ComponentSpace, StartLen, SpaceLen);

Result:= StrToFloat(Trim(ComponentSpace));
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = wpSelectComponents then
MsgBox(FloatToStr(GetComponentSpace), mbInformation, MB_OK);
Result:= True;
end;
Автор: boss911
Дата сообщения: 18.05.2007 18:53
Sero

Окно инстfлла стартует ближе к нижнему правому углу, после окончания анимации оно резко центрируетса, то есть идет прижок! Так же не могу скомпилировать с блоком procedure CancelButtonClick, пришлось полностью его вырезать!

Глянь плиз мой скрипт, исправ\добав там выше описанное, только с комментариями, что добавлено!
Автор: Sero
Дата сообщения: 18.05.2007 20:26
boss911
Вот поправил!
Автор: Yekver
Дата сообщения: 18.05.2007 21:42
Genri

Как создать страничку где будет находится текстовое поле для ввода ip адреса серверного компьютера? Как затем этот адрес записать перед {app}\Settings.ini?

Код: Filename: "{app}\Settings.ini"; Section: "Default"; Key: "dbPath"; String: "{app}\Base\Turuchet.gdb"
Автор: Sero
Дата сообщения: 18.05.2007 22:17
А где можно скачать музыку .xm или .mod
Автор: Genri
Дата сообщения: 18.05.2007 22:40
Yekver -- не понял задачи. Про страничку понял, про "...адрес записать перед {app}\Settings.ini" - не понял. Этот адрес будет вписываться в ини-файл? Или из ини-файла на сервере будут считываться какие-то параметры? Или ини-файл будет копироваться на локальный комп?

И кстати - что за сервер имеется ввиду? Файл-сервер, SQL Server?

А обязательно пользователю указывать адрес? Может лучше чтобы инсталлятор сам определил нужный IP? Или по крайней мере предоставил список доступных серверов, из которого пользователь выберет нужный? Иначе гарантированы очепятки либо гемор с проверкой валидности формата ввода.
Автор: NightW0lf
Дата сообщения: 18.05.2007 22:43
Sero

Цитата:
А где можно скачать музыку .xm или .mod

_http://keygenmusic.net/
Автор: Yekver
Дата сообщения: 18.05.2007 23:12
Genri
Значит задача такова:
пользователь указвает адрес сервера при установки программы(если есть какая-то возможность просканировать локальную сеть и вывести все доступные ip - это было бы вообще отлично) который дописывается в ini-файл в указанную мной строчку. Выглядит это примерно так:

Код: 192.168.0.1:{app}\Settings.ini
Автор: boss911
Дата сообщения: 19.05.2007 00:10
Sero

Симпатично вышло, спасибо! Смущают пока две вещи: это вздергивания (запуск) инсталла после окончания анимации и, если открыта страница лицензии или ридми, то анимация завершается на белом фоне! Что-то из этого решаемо?

Что скажешь про это:

Цитата:
А можно избавитса, чтоб в дефолтных (виндовых) кнопках небыло по краям очертания, а только вид самой кнопки?
Есть мысли? Просто в кнопке "Обзор" такого нет, может и там можно убрать!

Может Genri поможет?
Автор: Sampron
Дата сообщения: 19.05.2007 00:50
boss911
Найди в коде этот компонент with OuterNotebook do begin и добавь в него эту строку Color:=$a0a09f

Автор: Genri
Дата сообщения: 19.05.2007 01:10
Yekver -- не уверен что правильно понял, но кое-какой пример можешь взять [more=здесь]
Код:
[Setup]
AppName=My Program
AppVerName=My Program ver.1.5
DefaultDirName={pf}\My Program

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

[INI]
Filename: \\{code:GetServerIP}\{app}\Settings.ini; Section: "Default"; Key: "dbPath"; String: "{app}\Base\Turuchet.gdb"

[Code]
type
PAnsiChar = PChar;
LPARAM = DWORD;
HRESULT = Longint;
PIDL = DWORD;

BROWSEINFO = record
hwndOwner: HWND;
pidlRoot: PIDL;
pszDisplayName: PAnsiChar;
lpszTitle: PAnsiChar;
ulFlags: UINT;
lpfn: DWORD;
lParam: LPARAM;
iImage: Integer;
end;

function SHGetSpecialFolderLocation(hwndOwner: HWND; nFolder: Integer; var pidl: DWORD): HRESULT;
external 'SHGetSpecialFolderLocation@shell32.dll stdcall';

function SHBrowseForFolder(var lpbi: BROWSEINFO): PIDL;
external 'SHBrowseForFolder@shell32.dll stdcall';

function SHGetPathFromIDList(aPidl: PIDL; path: PChar): Boolean;
external 'SHGetPathFromIDList@shell32.dll stdcall';

function GetLocalComputerName: PChar;
external 'GetLocalComputerName@files:IPUtils.dll stdcall';

function GetLocalIPAddress: PChar;
external 'GetLocalIPAddress@files:IPUtils.dll stdcall';

function GetIPAddress(HostName: PChar): PChar;
external 'GetIPAddress@files:IPUtils.dll stdcall';

const
BIF_BROWSEFORCOMPUTER = $1000;
CSIDL_NETWORK = $12;

var
ServerPage: TInputQueryWizardPage;

function GetServerIP(Param: String): String;
begin
Result := ServerPage.Values[1];
end;

procedure BrowseComputer(Sender: TObject);
var
display_name, title: string;
bi: BROWSEINFO;
network, server_pidl: DWORD;
hwndParent: HWND;
NullPos : Integer;
begin
hwndParent := WizardForm.Handle;
SHGetSpecialFolderLocation(hwndParent, CSIDL_NETWORK, network);

bi.hwndOwner := hwndParent;
bi.pidlRoot := network;
SetLength(display_name, 261);
bi.pszDisplayName := PChar(display_name);
title := 'Select the Server:';
bi.lpszTitle := PChar(title);
bi.ulFlags := BIF_BROWSEFORCOMPUTER;
bi.lpfn := 0;
bi.lParam := 0;
server_pidl := SHBrowseForFolder(bi);
if server_pidl <> 0 then begin
NullPos := Pos(#0, display_name);
if NullPos > 0 then SetLength(display_name, NullPos - 1);

ServerPage.Values[1] := GetIPAddress(display_name);
end;
end;

procedure InitializeWizard;
var
button : TButton;
begin
ServerPage := CreateInputQueryPage(
wpWelcome,
'Select Server',
'What machine is your server on?',
'You must tell us which machine you will use as a server so that the program can connect automatically when it is started.');
ServerPage.Add('Local IP-address:', False);
ServerPage.Values[0]:= GetLocalIPAddress;
ServerPage.Edits[0].Enabled:= False;
ServerPage.Add('Server IP-address:', False);
button := TButton.Create(WizardForm);
button.Parent := ServerPage.Surface;
button.Left := WizardForm.DirBrowseButton.Left;
button.Top := ServerPage.Edits[1].Top - (WizardForm.DIREDIT.Top - WizardForm.DirBrowseButton.Top);
button.Width := WizardForm.DirBrowseButton.Width;
button.Height := WizardForm.DirBrowseButton.Height;
button.Caption := WizardForm.DirBrowseButton.Caption;
button.OnClick := @BrowseComputer;
ServerPage.Edits[1].Width := WizardForm.DIREDIT.Width;
end;
Автор: boss911
Дата сообщения: 19.05.2007 01:13
Sampron

Оу-е-е! Только вот загвоздка теперь в том, что нужно придерживаться однотонного изображения в той области, такая же проблема и с текстом!
Автор: Genri
Дата сообщения: 19.05.2007 01:16
boss911
Цитата:
Может Genri поможет?
-- а спать когда?
Автор: Yekver
Дата сообщения: 19.05.2007 09:22
Genri


Цитата:
Где взять IPUtils.dll - см.выше.


Я не нашёл нормальной ссылки, может кто может скинуть на какой-то фалообменник или мне на мыло sniveller@list.ru
Автор: Sero
Дата сообщения: 19.05.2007 10:01
NightW0lf
Спасибо!
Автор: NightW0lf
Дата сообщения: 19.05.2007 10:43
А в инно возможно реализовать возможность проверки файловой системы [FAT32, NTFS] выбранного локального диска? Если - да, тогда помогите реализовать ее в этом коде, надо чтобы при выборе диска производилась проверка файловой системы - если FAT32 то появляется сообщение о том, что для правильной работы нужно чтобы была NTFS, а если - NTFS то просто происходит переход на другую страницу.

[more=Код]

Код:
;Script by GloThin & Genri Edit by NightW0lf "Отображения списка локальных дисков пользователя на странице выбора директории".

[Setup]
;Название программы - инсталлятора, а также заголовок инсталлятора, (пожеланию можно версию указать):
AppName=Example.In.Percent.In.GB.MB.List.Lokal.Disc
;Версия программы - инсталлятора, (пожеланию можно указать - название + версию):
AppVerName=Example.In.Percent.In.GB.MB.List.Lokal.Disc 1.5
;Директория установки для программы - инсталлятора:
DefaultDirName=C:\Example.In.Percent.In.GB.MB.List.Lokal.Disc
;Название выходного файла компилятора:
OutputBaseFilename=in.percent.in.gb.mb.list.lokal.disc.by.glothin.genri


[Code]
const
NeedSize = 200000; //Прописать, сколько мегабайт необходимо
DRIVE_UNKNOWN = 0;
DRIVE_NO_ROOT_DIR = 1;
DRIVE_REMOVEABLE = 2;
DRIVE_FIXED = 3;
DRIVE_REMOTE = 4;
DRIVE_CDROM = 5;
DRIVE_RAMDISK = 6;

MB_ICONINFORMATION = $40;
MB_ICONEXCLAMATION = $30;
MB_ICONQUESTION = $20;    
MB_ICONSTOP = $10;
MB_ICONNONE = $0;

var
ListBox: TListBox;
Text: TNewStaticText;
hWnd: Integer;

function GetLogicalDrives: DWORD;
external 'GetLogicalDrives@kernel32.dll stdcall';

function GetDriveType(nDrive: string): Longint;
external 'GetDriveTypeA@kernel32.dll stdcall';

function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
external 'MessageBoxA@user32.dll stdcall';


procedure ListBoxOnClick(Sender: TObject);
var
NewLetter, OldString: string;
i: Integer;
begin
for i := 0 to ListBox.Items.Count - 1 do
begin
if ListBox.Selected[i] then
begin
NewLetter := Copy(ListBox.Items[i], 0, 1);
OldString := Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text));
WizardForm.DirEdit.Text := NewLetter + OldString;
end;
end;
end;


procedure InitializeWizard();
var
Page: TWizardPage;
Text: TNewStaticText;
Memo: TMemo;
Path: string;
FreeMB, TotalMB: Cardinal;
drives: DWORD;
i: integer;
begin
Text := TNewStaticText.Create(WizardForm);
Text.Top := 102;
Text.Width := 332;
Text.Height := 14;
Text.Caption := 'Список жестких дисков и свободного места';
Text.Parent := WizardForm.SelectDirPage;

ListBox := TListBox.Create(WizardForm);
ListBox.Top := 120;
ListBox.Width := 332;
ListBox.Height := ScaleY(90);
ListBox.Parent := WizardForm.SelectDirPage;
ListBox.OnClick := @ListBoxOnClick;
ListBox.Font.Name := 'Courier New';
ListBox.Font.Size := 10;
ListBox.Font.Style := [fsBold];
ListBox.Color := clBtnFace;

drives := GetLogicalDrives();
for i := 0 to 31 do
begin
if (drives and (1 shl i)) > 0 then
begin
Path := chr(ord('A') + i) + ':\';
if GetDriveType(Path) = DRIVE_FIXED then
begin
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB>1024 then ListBox.Items.Add(Path + ' ' + IntToStr(round(FreeMB / TotalMB * 100)) + '% ' + floatToStr(round(FreeMB/1024*100)/100) + ' GB')
else ListBox.Items.Add(Path + ' ' + IntToStr(round(FreeMB / TotalMB * 100)) + '% ' + IntToStr(FreeMB) + ' MB');
end;
end;
end;
end;


function NextButtonClick(CurPageID: Integer): Boolean;
var
Path,s: String;
FreeMB, TotalMB: Cardinal;
begin
Result:= True;
if CurPageID = wpSelectDir then
begin
Path:= ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB < (NeedSize*1024) then
begin
if FreeMB>1024 then
begin
s:='Для установки приложения необходимо '+ IntTostr(NeedSize)+ ' GB,'#13+'а на выбранном Вами диске доступно только '+ floatToStr(round(FreeMB/1024*100)/100) + ' GB!'
end
else s:='Для установки приложения необходимо '+ IntTostr(NeedSize)+ ' GB,'#13+'а на выбранном Вами диске доступно только '+ + IntToStr(FreeMB)+' MB';
MessageBox(hWnd, s, 'Недостаточно места на диске', MB_OK or $10)
Result := False;
end;
end;
end;
Автор: Kindly
Дата сообщения: 19.05.2007 12:29
Не смог реализовать показ внешнего курсора в инсталляторе через стандартную api(LoadCursorFromFileA), все таки было бы прекрасное дополнение к Sampron-овским разработкам. Поддерживает ли Inno изменение внешнего курсора, или только использует набор стандартных? Как и всем хотелось бы правильный код.
Автор: drakula 666
Дата сообщения: 19.05.2007 14:57
NightW0lf
помоги пожалуйста. у меня есть игра неустановленная я сделал ее пакет с записью в реестр, установил. все нормально работает. но обновление почему то не ставиться. пишет что инра не найдена. как поставить обновление?
Автор: Yekver
Дата сообщения: 19.05.2007 15:05
Genri

Чего-то я немного ступил по поводу того как скачать IPUtils.dll

Вообщем пока всё идёт нормально, но есть некоторые недочёты:

1. Не записывается определяемый при установки IP в ini-файл.
Вы меня наверное не совсем правильно поняли, но это ini должен храниться на локальном диске, а не на серваке, который указывается при установке. Соответственно проблема в том как преобразовать параметр \\{code:GetServerIP}\ так, чтобы он дописался в строчку String: "\\{code:GetServerIP}\{app}\Base\Turuchet.gdb" - примерно так.

2. Непорядок с порядком отображения страниц, у меня получается так, что сначала вылазит окошко с выбором IP, а потом тип установки, хотя должно быть наоборот. Это как-то исправляется?

Мой код:

Код:
[Code]
...
procedure InitializeWizard;
var
button : TButton;
begin
UsagePage := CreateInputOptionPage(wpWelcome,
'', '', True, False);
UsagePage.Add('Сервер');
UsagePage.Add('Клиент');
case GetPreviousData('UsageMode', '') of
'Сервер': UsagePage.SelectedValueIndex := 0;
'Клиент': UsagePage.SelectedValueIndex := 1;
else
UsagePage.SelectedValueIndex := 0;
end;

ServerPage := CreateInputQueryPage(
wpWelcome,
'Select Server',
'What machine is your server on?',
'You must tell us which machine you will use as a server so that the program can connect automatically when it is started.');
ServerPage.Add('Server IP-address:', False);
button := TButton.Create(WizardForm);
button.Parent := ServerPage.Surface;
button.Left := WizardForm.DirBrowseButton.Left;
button.Top := ServerPage.Edits[0].Top - (WizardForm.DIREDIT.Top - WizardForm.DirBrowseButton.Top);
button.Width := WizardForm.DirBrowseButton.Width;
button.Height := WizardForm.DirBrowseButton.Height;
button.Caption := WizardForm.DirBrowseButton.Caption;
button.OnClick := @BrowseComputer
ServerPage.Edits[0].Width := WizardForm.DIREDIT.Width;

LocalPage := CreateInputQueryPage(
wpWelcome,
'Your local ip',
'What machine is your server on?',
'You must tell us which machine you will use as a server so that the program can connect automatically when it is started.');
LocalPage.Add('Local IP-address:', False);
LocalPage.Values[0]:= GetLocalIPAddress;
LocalPage.Edits[0].Enabled := True;
end;
...

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = LocalPage.ID) and (UsagePage.SelectedValueIndex = 1) then
Result := True
else if (PageID = ServerPage.ID) and (UsagePage.SelectedValueIndex = 0) then
Result := True
else
Result := False;
end;
Автор: NightW0lf
Дата сообщения: 19.05.2007 15:09
drakula 666
Проверь личку!
Автор: Sampron
Дата сообщения: 19.05.2007 15:19
maxdddca123
Вот версия скина где белый фон не проскакивает: http://data.cod.ru/1008106954
Огромное спасибо Genri за поправку!

Но в этой версии есть две проблемы которые нужно править ручками:
1) На странице wpUserInfo не отображается текст серийнного номера нужно вручную вписывать.
2) Была проблема со стандартными радиобаттонами на перезагрузку их невозможно было переместить в нижнюю часть окна инсталлятора, заместь них создал новые и чтобы они отображались нужно в Procedure ShowPageComponents(CurPageID: Integer); удалить строку WizardForm.RunList.Show и задействовать радиобаттоны.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Mail.ru агент - вход не выполнен


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