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

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

Автор: GloThin
Дата сообщения: 12.08.2007 13:43
Chanka

Цитата:
Как сделать чтобы при выходе из установки запускался авторан.

Добавь в секцию [Run]
строку:
Filename: "{app}\autorun.exe"; Flags: postinstall
Автор: Chanka
Дата сообщения: 12.08.2007 13:58
GloThin,
Надо чтобы чек бокса не было.
Автор: chogo
Дата сообщения: 12.08.2007 14:07
NightW0lf

Цитата:
Если покаким либо причинам невозможно скачать руководство то вот скрипт

Я не то просил

Цитата:
(игры в последнее время здоровые, на один DVD не влазят если inno паковать, только 7-zip спасает).

Хотелось вначале заархивировать в 7-zip, а потом засунуть в inno, чтоб инталяшка нормальная была.
Автор: 3eJIeHb
Дата сообщения: 12.08.2007 15:02
Люди, помогите. Мне нужно чтобы при запуске инстала он считывал значение из реестра и если значение больше значения AppVersion, то вадавал сообщение: "Вы устанавливаете более поздюю версию порграммы, чем стоит у вас на комьютере, вы желаете предварительно удалить её?" Кнопочки: Да Нет. При Да удаляет прогу и запускает инстал, при Нет закрывает инстал. Такое вообще реально сделать?
Автор: Sero
Дата сообщения: 12.08.2007 15:11
chogo

Цитата:
Хотелось вначале заархивировать в 7-zip, а потом засунуть в inno, чтоб инталяшка нормальная была.


Код NightW0lf'а то что ты просил,"NFSC_RUS.exe" и есть сам 7-zip архив.
Просто там пример для установки русификации из 7-zip SFX архива!

P.S. надо качать Руководство по расширенным возможностям Inno Setup 5 [не для чайников] от Kindly, так сложно?
Автор: ANDROID
Дата сообщения: 12.08.2007 16:05
Народ всё таки по моей проблеме ( Отправлено: 19:36 12-08-2007) кто-нить подскажите, а то очень нужно...

З.Ы.
Пробовал получать системный курсор через:
function LoadCursor(): Longint;
external 'LoadCursor@user32 stdcall';
...
procedure DeinitializeSetup();
begin
OriginalWindowsCursor:= LoadCursor(HInstance, IDC_ARROW);
SetSystemCursor(OriginalWindowsCursor, OCR_NORMAL);
end;

но ругается на HInstance как неизвестный идентификатор...
Автор: chogo
Дата сообщения: 12.08.2007 16:52
Sero

Цитата:
P.S. надо качать Руководство по расширенным возможностям Inno Setup 5 [не для чайников] от Kindly, так сложно?

Нее, не сложно, просто лень, но видно придёться
Спасибо за помощь.
Автор: Chanka
Дата сообщения: 12.08.2007 18:54
Sero,
Можно еще один вопросик насчёт страницы с DirectX
Можно ли когда устанавливается DirectX чтобы под надписью DirectX была надпись Идёт установка DirectX. Ждите...
Автор: Sero
Дата сообщения: 12.08.2007 19:25
Chanka

Цитата:
Можно ли когда устанавливается DirectX чтобы под надписью DirectX была надпись Идёт установка DirectX. Ждите...


[more=Код]
Код:
[CustomMessages]
Text1=Vampire: The Masquerade Bloodlines requires Microsoft DriectX 9.0c drivers to run properly. These drivers may not be compatible 'with some video cards and certain display modes.
Text2=DirectX 9.0c will be installed over any previous versions of Dir'ectX, after which you may be instructed to restart your computer'.
YesRadio=Yes, I want to install DirectX now.
NoRadio=No, I do not want to install DirectX at this time.
Text3=Do you want to install DirectX 9.0c?
Text4=Installing DirectX...

[Code]
var
Bevel: TBevel;
Text1,Text2,Text3,Text4: TNewStaticText;
RadioButton1,RadioButton2: TRadioButton;

function Form_NextButtonClick(Page: TWizardPage): Boolean;
var ResultCode: Integer;
begin
Result:=True
if RadioButton1.Checked then
begin
Text4.Visible:=True
Exec(ExpandConstant('{src}\DirectX\DXSETUP.EXE'), '/silent', '', SW_SHOW,
ewWaitUntilTerminated, ResultCode)
Text4.Visible:=False
end
if RadioButton2.Checked then
begin
if MsgBox('If you do not have DirectX 9.0c or highter, the game will not run properly.'#13+
+'Are you sure you do not want to install DirectX 9.0c at this time?', mbConfirmation,MB_YESNO)=IDNO then
Result:=False
end
end;

function DirectxPage(PreviousPageId: Integer): Integer;
var
Page: TWizardPage;
begin
Page := CreateCustomPage(PreviousPageId,'DirectX','');

Bevel := TBevel.Create(Page);
with Bevel do
begin
Parent := Page.Surface;
Left := ScaleX(8);
Top := ScaleY(136);
Width := ScaleX(385);
Height := ScaleY(73);
Shape := bsFrame;
end;

Text1 := TNewStaticText.Create(Page);
with Text1 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:Text1}');
Left := ScaleX(8);
Top := ScaleY(8);
Width := ScaleX(389);
Height := ScaleY(38);
AutoSize := False;
TabOrder := 0;
WordWrap := True;
end;

Text2 := TNewStaticText.Create(Page);
with Text2 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:Text2}');
Left := ScaleX(8);
Top := ScaleY(64);
Width := ScaleX(389);
Height := ScaleY(30);
AutoSize := False;
TabOrder := 1;
WordWrap := True;
end;

RadioButton1 := TRadioButton.Create(Page);
with RadioButton1 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:YesRadio}');
Left := ScaleX(24);
Top := ScaleY(152);
Width := ScaleX(345);
Height := ScaleY(17);
TabOrder := 2;
Checked := True;
end;

RadioButton2 := TRadioButton.Create(Page);
with RadioButton2 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:NoRadio}');
Left := ScaleX(24);
Top := ScaleY(176);
Width := ScaleX(337);
Height := ScaleY(17);
TabOrder := 3;
end;

Text3 := TNewStaticText.Create(Page);
with Text3 do
begin
Parent := Page.Surface;
Caption :=
ExpandConstant('{cm:Text3}');
Left := ScaleX(8);
Top := ScaleY(104);
Width := ScaleX(381);
Height := ScaleY(14);
AutoSize := False;
TabOrder := 4;
WordWrap := True;
end;

Text4 := TNewStaticText.Create(Page);
with Text4 do
begin
Parent:=Page.Surface;
Caption:=ExpandConstant('{cm:Text4}')
Left:=8
Top:=220
AutoSize:=True
TabOrder:=5
Visible:=False
end
with Page do
begin
OnNextButtonClick := @Form_NextButtonClick;
end;

Result := Page.ID;
end;


procedure InitializeWizard();
begin
DirectxPage(wpLicense);
end;
Автор: Chanka
Дата сообщения: 12.08.2007 19:47
Sero,
Большое спасибо!
Автор: Genri
Дата сообщения: 12.08.2007 21:14
ANDROID
http://forum.ru-board.com/topic.cgi?forum=5&topic=23235&start=300#7
Автор: ANDROID
Дата сообщения: 12.08.2007 21:45
Genri
Я на основе твоего кода и делал Но только сразу два в одном, функция GetCursor получает текущий курсор на момент запуска установщика, а у меня при его запуски винда меняет на несколько секунд стандартный курсор на тот что с часами и в итоге по завершению работы установщика основным курсором в винде становятся песочные часы)))
Может есть еще один способ получения основного курсора, вся надежда на Вас;)
Автор: Genri
Дата сообщения: 12.08.2007 23:20
ANDROID -- используй вторую часть (изменение для отдельных компонентов). Выставишь NextButton, WelcomeLabel1 и может еще для пары компонентов и все. А при выходе из деинсталлятора курсор будет восстановлен автоматом.
Автор: ANDROID
Дата сообщения: 12.08.2007 23:33
Genri
Чтобы было примерно так: [more=код][Files]
;Курсоры
Source: G:\Program Files\EA GAMES\Battlefield 2\mods\bf2\menu\External\FlashMenu\Cursor\cursor_arrow.ani; DestDir: {tmp}; Flags: dontcopy
Source: G:\Program Files\EA GAMES\Battlefield 2\mods\bf2\menu\External\FlashMenu\Cursor\cursor_wait.ani
; DestDir: {tmp}; Flags: dontcopy

[Code]
Const
GCL_HCURSOR = (-12);
OCR_NORMAL = 32512;

var
CursorMain, CursorComponent: Longint;

function LoadCursorFromFile(FileName: String): Longint;
external 'LoadCursorFromFileA@user32 stdcall';

function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint;
external 'SetClassLongA@user32 stdcall';

function SetCursor(Cursor: Longint): Longint;
external 'SetCursor@user32 stdcall';

procedure InitializeWizard;
begin
ExtractTemporaryFile('cursor_arrow.ani');
ExtractTemporaryFile('cursor_wait.ani');
CursorMain:= LoadCursorFromFile(ExpandConstant('{tmp}') + '\cursor_arrow.ani');
CursorComponent:= LoadCursorFromFile(ExpandConstant('{tmp}') + '\cursor_wait.ani');
SetClassLong(WizardForm.WelcomeLabel1.Handle, GCL_HCURSOR, CursorMain);
SetClassLong(WizardForm.WelcomeLabel2.Handle, GCL_HCURSOR, CursorMain);
SetClassLong(WizardForm.SelectComponentsPage.Handle, GCL_HCURSOR, CursorMain);
SetClassLong(WizardForm.WelcomePage.Handle, GCL_HCURSOR, CursorMain);
SetClassLong(WizardForm.SelectDirPage.Handle, GCL_HCURSOR, CursorMain);
SetClassLong(WizardForm.StatusLabel.Handle, GCL_HCURSOR, CursorMain);
SetClassLong(WizardForm.FileNameLabel.Handle, GCL_HCURSOR, CursorMain);
SetClassLong(WizardForm.ProgressGauge.Handle, GCL_HCURSOR, CursorComponent);
SetClassLong(WizardForm.FinishedLabel.Handle, GCL_HCURSOR, CursorMain);
SetClassLong(WizardForm.FinishedHeadingLabel.Handle, GCL_HCURSOR, CursorMain);
SetClassLong(WizardForm.BackButton.Handle, GCL_HCURSOR, CursorComponent);
SetClassLong(WizardForm.NextButton.Handle, GCL_HCURSOR, CursorComponent);
SetClassLong(WizardForm.CancelButton.Handle, GCL_HCURSOR, CursorComponent);
SetClassLong(WizardForm.DirBrowseButton.Handle, GCL_HCURSOR, CursorComponent);
SetClassLong(WizardForm.GroupBrowseButton.Handle, GCL_HCURSOR, CursorComponent);
end;[/more] ?
Автор: Genri
Дата сообщения: 12.08.2007 23:42
ANDROID -- примерно так. только, нет необходимости задавать курсор абсолютно для всех компонентов поименно. Если задашь для WelcomeLabel1, то все компоненты того-же типа (TNewStaticText) будут иметь тот-же курсор. Так же и с TEdit и с TButton и т.д.


Добавлено:
ни тогда, ни сейчас я особо не тестировал. Что знал, то предложил. Так что...
Автор: ANDROID
Дата сообщения: 13.08.2007 00:20
А какие компоненты нужно указать, чтобы поменять курсор при наведении на:
1) область ниже BeveledLabel
2) заголовок окна установщика и по краям
3) линию разделяющую верхнюю область от средней
4) маленькую картинку в правом верхнем углу WizardSmallBitmapImage
5) на список выбора компонентов
Автор: Genri
Дата сообщения: 13.08.2007 13:59
ANDROID
Код:
procedure InitializeWizard;
begin
NewCursor:= LoadCursorFromFile('C:\TEMP\pen_i.cur');
SetClassLong(WizardForm.Handle, GCL_HCURSOR, NewCursor);
SetClassLong(WizardForm.NextButton.Handle, GCL_HCURSOR, NewCursor);
SetClassLong(WizardForm.WelcomePage.Handle, GCL_HCURSOR, NewCursor);
SetClassLong(WizardForm.WelcomeLabel1.Handle, GCL_HCURSOR, NewCursor);
SetClassLong(WizardForm.LicenseMemo.Handle, GCL_HCURSOR, NewCursor);
SetClassLong(WizardForm.DiskSpaceLabel.Handle, GCL_HCURSOR, NewCursor);
SetClassLong(WizardForm.MainPanel.Handle, GCL_HCURSOR, NewCursor);
SetClassLong(WizardForm.TypesCombo.Handle, GCL_HCURSOR, NewCursor);
SetClassLong(WizardForm.ComponentsList.Handle, GCL_HCURSOR, NewCursor);
SetClassLong(WizardForm.YesRadio.Handle, GCL_HCURSOR, NewCursor);
end;
Автор: Sero
Дата сообщения: 13.08.2007 16:53
Обнавил код для страницы с проверкой предыдущей установки:
[more=Код]

Код:
[Setup]
AppName=Already Installed Page
AppVerName=Already Installed Page 1.0
CreateAppDir=no
Uninstallable=no

[Code]
var
Text: TLabel;
RadioButton_1, RadioButton_2: TRadioButton;
Uninstall: string;
ResultCode: Integer;
Page: TWizardPage;

//----------------------------------------------------------------------------------------------------------------------------------------------------------------

function Page_NextButtonClick(Page: TWizardPage): Boolean;
var
hWnd: Integer;
begin
Result := True;
if RadioButton_1.Checked then
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup Scripting v5.0_is1','UninstallString', Uninstall) then
UnInstall := RemoveQuotes(UnInstall);
if not Exec(UnInstall, '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
begin
//MessageBox(hWnd, 'Произошла ошибка при деинсталляции.'#13#13'' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещен, удален или переименован.', 'Error', MB_OK or $10)
MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещен, удален или переименован.', mbError, MB_OK)
Result:=False
end
if RegValueExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup Scripting v5.0_is1','UninstallString') = True then
Result:=False
end
else if RadioButton_2.Checked then
Result:=True
end;


//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//функция для создания новой страницы
function CheckInstalledPage(PreviousPageId: Integer): Integer;
var Location: String;
begin
RegQueryStringValue(HKLM,'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup Scripting v5.0_is1','InstallLocation',Location);
Page := CreateCustomPage(2,'Previous Installation Found',
'Please choose how you want to proceed.');
with Page do
begin

Text := TLabel.Create(Page);
with Text do
begin
Parent := Page.Surface;
Caption := 'Inno Setup Scripting уже установлен в директорию '+Location+' на Вашем'+#13+'компьютере. Рекомендуется,чтобы Вы деинсталлировали текущую версию WarCraft III'+#13+'перед продолжением.'
Left := 0;
Top := 24;
AutoSize := True;
Transparent := True;
end

RadioButton_1 := TRadioButton.Create(Page);
with RadioButton_1 do
begin
Parent := Page.Surface;
Caption := 'Uninstall before continuing (recommended)';
Left := 0;
Top := 104;
Width := 233;
Height := 17;
Checked := True;
TabStop := True;
end

RadioButton_2 := TRadioButton.Create(Page);
with RadioButton_2 do
begin
Parent := Page.Surface;
Caption := 'Overwrite current version';
Left := 0;
Top := 144;
Width := 153;
Height := 17;
end

OnNextButtonClick := @Page_NextButtonClick;

Result := Page.ID;
end
end;

//----------------------------------------------------------------------------------------------------------------------------------------------------------------

procedure InitializeWizard();
begin
CheckInstalledPage(wpLicense); //создание новой страницы
end;

//----------------------------------------------------------------------------------------------------------------------------------------------------------------

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID = Page.ID then
if RegValueExists(HKLM, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup Scripting v5.0_is1','UninstallString') = False then
Result := True; //Если значение реестра отсутствует, страница будет пропущена
end;
Автор: Chanka
Дата сообщения: 13.08.2007 17:08
Sero,
Не могу оценить твою работу Пишет Unknown identifer 'RegQueryStringValueExists'
Автор: Sero
Дата сообщения: 13.08.2007 17:50
Chanka
Блин! все поправил!
Автор: Chanka
Дата сообщения: 13.08.2007 18:06
Вот это другое дело Всё замечательно работает.
Автор: chogo
Дата сообщения: 13.08.2007 19:41
Подскажите как заставить удалить полностью папку проги, пробовал [UninstallDelete] - не пашет ?

[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
UninstallDisplayIcon={app}test.exe
Compression=zip
SourceDir=F:\test
OutputDir=F:\output

[Files]
Source: F:\test\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs

[Run]
Filename: "{src}\setup-7zip.exe"; WorkingDir: "{src}"; Parameters: "-y -o""{app}"""; StatusMsg: "Идёт извлечение архива..."; Flags: waituntilterminated

[UninstallDelete]
Type: filesandordirs; Name: {app}
Автор: NightW0lf
Дата сообщения: 13.08.2007 19:58
chogo

Цитата:
Подскажите как заставить удалить полностью папку проги, пробовал [UninstallDelete] - не пашет ?

Я так понял у тебя проблема из-за того что ты используешь 7zip, причина в том что инно не может удалить то что он сам не создал для решения есть один способ:
Скачай на конец все-таки Руководство по расширенным возможностям Inno Setup 5 [не для чайников] от Kindly там описан этот случай, но если все таки ты опять не скачаешь, то вот прога для создания пустышек оригинальных файлов, тебе просто надо создать пустышки и добавить их в секцию [Files], тобишь сетап сначала распакует пустышки а потом 7zip их перепишет и при деинсталляции inno сам все удалит.
Автор: avzaytsev
Дата сообщения: 13.08.2007 22:18
Нужна консультация. Имеем стандартный код для добавления фоновой картинки:

procedure InitializeWizard();
var
BackgroundBitmapImage: TBitmapImage;
s:string;
width, height:Integer;
begin
ExtractTemporaryFile('Xenus.bmp');
s:=ExpandConstant('{tmp}')+'\Xenus.bmp';
WizardForm.CancelButton.BringToFront;
width:=GetSystemMetrics(0);
height:=GetSystemMetrics(1);
MainForm.Width:=width;
MainForm.Height:=height;
width:=MainForm.ClientWidth;
height:=MainForm.ClientHeight;
MainForm.Left := 0;
MainForm.Top := 0;
BackgroundBitmapImage:=TBitmapImage.Create(MainForm);
BackgroundBitmapImage.Bitmap.LoadFromFile(s);
BackgroundBitmapImage.Align:=alClient;
BackgroundBitmapImage.Parent:=MainForm;
BackgroundBitmapImage.Stretch:=True;
MainForm.Visible:=True;

В результате в окне выбора компонентов все хорошо:


При добавлении в код строк:

WizardForm.Position:=poScreenCenter;
MainForm.BORDERSTYLE:=bsNone;

получается следующая картина:


Что не так?
Автор: chogo
Дата сообщения: 14.08.2007 07:41
NightW0lf

Всё перечитал, сделал пустышки и всёравно не удаляются ярлыки и содержимое {app}, удаляются только unins000.dat и unins000.exe, а если убрать строку

Цитата:
[Run]
Filename: "{src}\setup-7zip.exe"; WorkingDir: "{src}"; Parameters: "-y -o""{app}"""; StatusMsg: "Идёт извлечение архива..."; Flags: waituntilterminated

то всё норм.

Вот полностью скрипт

Цитата:
[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
UninstallDisplayIcon={app}test.exe
Compression=zip
SourceDir=F:\test
OutputDir=F:\output

[Files]
Source: F:\test\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs

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

[Icons]
Name: {userdesktop}\Test; Filename: {app}\test.exe; WorkingDir: {app}
Name: {group}\Test; Filename: {app}\test.exe; WorkingDir: {app}
Name: {group}\Uninstall Test; Filename: {uninstallexe}; WorkingDir: {app}

[Run]
Filename: "{src}\setup-7zip.exe"; WorkingDir: "{src}"; Parameters: "-y -o""{app}"""; StatusMsg: "Идёт извлечение архива..."; Flags: waituntilterminated


Проверте плиз мож чё не так делаю?
Автор: Chuvakstepan
Дата сообщения: 14.08.2007 09:08
chogo
Не совсем понятна в твоём скрипте директива UninstallDisplayIcon в твоём скрипте. Других ошибок не обнаружил. Всё должно работать
Автор: chogo
Дата сообщения: 14.08.2007 09:21
Chuvakstepan
В меню "Установка и удаление" значёк берётся из этого файла.

Правильно то оно правильно написано а в реале не пашет
Может другую версию Inno поставить...
Автор: Genri
Дата сообщения: 14.08.2007 10:02
avzaytsev -- MainForm.BORDERSTYLE вызывает пересоздание формы (уже без компонентов). Дальнейшую обработку придется писать вручную.

chogo -- какие атрибуты у файлов после распаковки ?

Автор: chogo
Дата сообщения: 14.08.2007 10:13
Genri
атрибуты в норме, никакие не стоят
Автор: Genri
Дата сообщения: 14.08.2007 10:35
chogo -- c 7zip не работал, но могу посоветовать следующее :
1. Убрать распаковку из скрипта
2. Проинсталлировать
3. Вручную распаковать архив (запустив с теми-же параметрами, но в какую-нибудь временную папку
4. Скопировать часть или все файлы из этой временной папки поверх проинсталлированных
5. Попробовать удалить.
....................................
6. Проделать тоже самое, но перед инсталляцией в скрипт для файлов добавить флаг uninsremovereadonly

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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