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

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

Автор: ZavadS
Дата сообщения: 07.01.2007 23:47
Помогите сделать инсталлятор. Задача вот такова. Нужно при русификации программы сделать резервные копии заменяемых файлов, а при удаленные русификатора, повернуть все на место. А именно, папка и в ней несколько папок с файлами. Просмотрел всю тему на данном сайте попробовал сделать скрипт. Во время компиляции, выдает ошибку в строке 28.

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=C:\SETUP
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

[Tasks]
Name: arc; Description: "Создать резервную копию оригинальных файлов "

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

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
CopyDir(ExpandConstant('{app}\Skin'),ExpandConstant('{app}\Backup'));
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
CopyDir(ExpandConstant('{app}\Backup\'),ExpandConstant('{app}\Skin'));
end;
end;
Автор: Genri
Дата сообщения: 08.01.2007 00:12
ZavadS -- А ты строку:
#include "SHFileOperation.iss"
... не забыл вставить? И сам файл SHFileOperation.iss у тебя есть? На будущее - желательно указывать не номер строки, а само сообщение.

И внимательнее со слешами. Если я правильно помню, при инсталляции указанного тобой скрипта, в результате получим ..\Backup\Skin\..., а при деинсталляции, получим ..\{app}\Skin\Skin\...
Автор: Kurikka
Дата сообщения: 08.01.2007 09:48
Изучаю Inno.

А можно сделать так? Желательно пример.

По ходу установки экран с выбором:

1. Вы хотите, чтобы прога имела общие настройки для всех юзеров
2. У каждого свои

И где эти настройки сохранять потом, чтобы можно было в них писать (настройки хранятся в файлах)? Желательно для Win от 98 до Vista.
И как сделать так, чтобы Setup в зависимости от выбора писал в реестр запись о выборе?
Автор: NightW0lf
Дата сообщения: 08.01.2007 12:03
Привет ВСЕМ!
Я вновь решел вернуться к "БЭКАПАМ"

Теперь я нашел там небольшую неточность в моем скрипте:
[more=здесь]
#include "SHFileOperation.iss"

[Setup]
AppName=My Program PATCH
AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
DefaultDirName=C:\_EXMPLE
DefaultGroupName=My Program
OutputDir=C:\SETUP
OutputBaseFilename=_setup_patch_
Compression=lzma
SolidCompression=yes
;Изменяет иконку на странице "Установка и удаление программ" в Панели управления
UninstallLogMode=overwrite
;Означает создавать ли автоматический деинсталлятор. При значении "yes" он создается. При значении "no" автоматическое удаление будет невозможно, так что пользователь должен будет вручную удалять программу.
Uninstallable=yes
UninstallFilesDir={app}\Install_Rus
DisableStartupPrompt=no

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


[Tasks]
Name: arc; Description: "Создать резервную копию оригинальных файлов "


[Files]
Source: "C:\EX_chemax68.exe"; DestDir: {app}; BeforeInstall: CreateBackup; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion



[Run]
Filename: "{app}\EX_chemax68.exe"; Description: "{cm:LaunchProgram,My Program}"; Flags: nowait postinstall skipifsilent



[Code]
var
ArcDir: String;

procedure CreateBackup();
var
SrcFile, DestFile: string;
begin
ArcDir:= AddBackslash(ExpandConstant('{app}\Install_Rus\Backup'))
ForceDirectories(ArcDir);
SrcFile:= AddBackslash(ExpandConstant('{app}')) + ExtractFileName(CurrentFileName);
DestFile:= AddBackslash(ArcDir) + ExtractFileName(CurrentFileName);
FileCopy(SrcFile, DestFile, False);
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
CopyDir(ExpandConstant('{app}\'),ExpandConstant('{app}\Install_Rus\Backup'));
// или
// MoveDir(ExpandConstant('{app}\'),ExpandConstant('{app}\Backup'));
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Install_Rus\Backup\'),ExpandConstant('{app}'));
// RemoveDir удалит только, если папка пустая
RemoveDir(ExpandConstant('{app}\Install_Rus\Backup'));
RemoveDir(ExpandConstant('{app}\Install_Rus'));
// DelTree использовать не рекомендуется,
// так как будут удалены все вложенные папки!
// DelTree(ExpandConstant('{app}\Backup'), True, True, True);
end;
end;
[/more]

Неточность заключается в том что в папку "\Install_Rus\Backup" копируется все содержимое директории установки ("{app}") я так понял это из-за "MoveDir(ExpandConstant('{app}\Install_Rus\Backup\'),ExpandConstant('{app}'));", Genri привел на предыдущем посте пример кода "SHFileOperation.iss" с возможностью имеено копирования\перемещения ФАЙЛОВ (function CopyFiles(const fromDir, toDir, fileMask: string): Boolean;) тогда если не трудно то помоги те мне с ней разобраться!

Зарание благодарю!
Автор: AtotIK
Дата сообщения: 08.01.2007 12:14
2 NightW0lf

[Files]
Source: "{app}\SomeFile_1.file"; DestDir: "{app}\Backup"; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion external; BeforeInstall: HideInstallPath;
Source: "{app}\SomeFile_2.file"; DestDir: "{app}\Backup"; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion external; AfterInstall: ShowInstallPath;

[Messages]
StatusExtractFiles=Создание конфигурационных файлов...

[Code]
procedure InitializeWizard();
begin
WizardForm.FileNameLabel.Visible:= False;
end;

Добавлено:

Да, как там насчёт того патча к инсталлятору который делает слайд-шоу?

Добавлено:

В последних инсталляторах SerGEAnt'а пароль в файле CompiledCode.bin
разделён на кусочки, а раньше показывался весь.

Вопрос: Как ЭТО реализовать?
Автор: Genri
Дата сообщения: 08.01.2007 16:52
NightW0lf -- каждый инсталлятор - это эксклюзив. Соответственно и бэкап в каждом случае уникален. Кто-то пользуется копированием, кто-то перемещением, кому-то надо сохранить все, а кому-то только нескоторые файлы.
Возможно, что в твоем случае, можно использовать следующее:
Код:
#include "SHFileOperation.iss"

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

[Files]
Source: Files\*.*; DestDir: {app}; Flags: ignoreversion recursesubdirs; BeforeInstall: CreateBackup

[Code]
function MoveFile(const srcFile, destFile: PChar):Integer;
external 'MoveFileA@kernel32.dll stdcall';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Backup\'),ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Backup\'));
end;
end;

procedure CreateBackup;
var
srcFile, destFile: string;
basePath, shortPath: string;
begin
basePath:= ExpandConstant('{app}');
srcFile:= ExpandConstant(CurrentFileName);
shortPath:= srcFile;
StringChangeEx(shortPath, basePath, '', True);
destFile:= ExpandConstant('{app}\Backup') + shortPath;
ForceDirectories(ExtractFilePath(destFile));
MoveFile(PChar(srcFile), PChar(destFile));
end;
Автор: DCFan
Дата сообщения: 08.01.2007 17:33
Привет!
А мона сделать, чтобы файлы некуда не перемещались, а переименовались? Например: в MyProg.exe.bak
Автор: Genri
Дата сообщения: 08.01.2007 17:45
DCFan

Цитата:
мона сделать, чтобы файлы некуда не перемещались, а переименовались?

Сохранять просто. Достаточно изменить процедуру CreateBackup :
Код:
procedure CreateBackup;
var
srcFile, destFile: string;
begin
srcFile:= ExpandConstant(CurrentFileName);
destFile:= srcFile + '.bak';
MoveFile(PChar(srcFile), PChar(destFile));
end;
Автор: DCFan
Дата сообщения: 08.01.2007 18:04
Genri

Цитата:
А вот для восстановления при деинсталляции, придется прописывать отдельную процедуру.

Чё за процедура и как её писать?

Цитата:
Как я и говорил: каждый инсталлятор - это эксклюзив (у каждого свои требования). Правда зачастую, требования превышают возможности, ограниченные знаниями, по причине лени


Автор: Genri
Дата сообщения: 08.01.2007 18:51
DCFan
[more=Здесь]
Код:
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DisableProgramGroupPage=yes

[Files]
Source: Files\*.*; DestDir: {app}; Flags: ignoreversion recursesubdirs; BeforeInstall: CreateBackup

[Code]
procedure CreateBackup;
var
srcFile, destFile: string;
begin
srcFile:= ExpandConstant(CurrentFileName);
destFile:= srcFile + '.bak';
DeleteFile(destFile);
RenameFile(srcFile, destFile);
end;

procedure RestoreBackup(backupDir: string);
var
srcFile, destFile: string;
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: string;
begin
APath := AddBackslash(backupDir);
FindResult := FindFirst(APath + '*.bak', FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
srcFile:= APath + FSR.Name;
destFile:= Copy(srcFile, 0, Length(srcFile)-4);
DeleteFile(destFile);
RenameFile(srcFile, destFile);
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
{Recursion} RestoreBackup(APath + DSR.Name);
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall then
begin
RestoreBackup(ExpandConstant('{app}'))
end;
end;
Автор: NightW0lf
Дата сообщения: 08.01.2007 19:32
Genri, AtotIK
Спасибо за Вашу ОГРОМНУЮ помощь оказанную мне в создании "Бэкапов"!
Автор: DCFan
Дата сообщения: 08.01.2007 20:13
Genri
Большое спасибо! Всё прекрасно работает! Но вот такой вопросик: как сделать, чтобы переименование файлов в ‘bak’, происходило только в том случае, если на странице доп. задачи (Tasks) пользователь отметил "Создать резервную копию оригинальных файлов"?
Автор: NightW0lf
Дата сообщения: 08.01.2007 21:27
Еще вопрос:
Можно как не будь убрать это сообщение при установке в существующую папку:

Папка существует
Папка
X:\xxx\xx
уже существует. Все равно установить в эту папку?

Автор: Genri
Дата сообщения: 08.01.2007 22:22
DCFan -- IsTaskSelected (см.в хелпе)
NightW0lf -- DirExistsWarning (см.в хелпе)



Добавлено:
AtotIK

Цитата:
В последних инсталляторах SerGEAnt'а пароль в файле CompiledCode.bin
разделён на кусочки, а раньше показывался весь.
-- Я смотрю многие озабочены проблемой скрытия своих трудов от посторонних глаз (я так подозреваю, чтобы заказчик не узнал, что трудная и очень сложная работа, за которую он заплатил кучу денег, состоит из двух строк и одного комментария ) Впрочем, это не мое дело. А что касается разделения пароля, то можно использовать [more=следующие ]
Код:
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DisableProgramGroupPage=yes
Encryption=yes
Password=Inn0

[Files]
Source: Files\*.*; DestDir: {app}; Flags: ignoreversion recursesubdirs
Source: Files_ext\CompiledCode.bin; DestDir: embedded; Flags: dontcopy

[Code]
var
str: string;
MyArray: array of Char;

function InitializeSetup(): Boolean;
begin
MyArray := ['A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m',
'n','o','p','q','r','s','t','u','v','w','x','y','z',
'1','2','3','4','5','6','7','8','9','0',
'!','@','#','$','%','^','&','*','(',')'];
Result:= True;
end;

function CheckPassword(Password: String): Boolean;
begin
WizardForm.PasswordEdit.Text:= 'Вот и нет пароля';
WizardForm.PasswordPage.Free;
Result:= True;
end;

procedure InitializeWizard();
begin
WizardForm.PasswordEdit.Visible:= False;
WizardForm.PasswordEdit.Text:= '';
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
str:= GetDateTimeString('ss', #0, #0);
Result:= True;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpPassword then
begin
WizardForm.PasswordEdit.Text:= MyArray[8]+MyArray[39]+MyArray[39] +
IntToStr(StrToInt(str) - StrToInt(GetDateTimeString('ss', #0, #0)));
WizardForm.NextButton.OnClick(WizardForm.NextButton);
end;
end;
Автор: ZavadS
Дата сообщения: 09.01.2007 02:10
Genri

Цитата:
-- А ты строку:
#include "SHFileOperation.iss"
... не забыл вставить? И сам файл SHFileOperation.iss у тебя есть? На будущее - желательно указывать не номер строки, а само сообщение.


Я ее не ставил, потому что самого файла SHFileOperation.iss не имею. Где этот файл можно взять. И в какую строку его вписать? Ошибка компиляции такова
Column 1: Unknown identifier ‘CopyDir’
Автор: Genri
Дата сообщения: 09.01.2007 02:44
ZavadS

Цитата:
файла SHFileOperation.iss не имею. Где этот файл можно взять

SHFileOperation.iss Там же небольшой пример использования.

Дополнение к SHFileOperation.iss


Автор: GRom V
Дата сообщения: 09.01.2007 05:10
Chanka
как на счет патченного инсталлятора?
Автор: BAPK
Дата сообщения: 09.01.2007 09:24

Цитата:
Руководство по расширенным возможностям Inno Setup 5 (не для чайников), забираем здесь(3 версия),
новое (4 версия) руководство.

file not found...
Автор: Chanka
Дата сообщения: 09.01.2007 12:10

Цитата:
как на счет патченного инсталлятора?

Всё будет. В субботу или в воскресенье выложу.
А теперь очень прошу помочь мне: кто умеет работать с ДЕЛЬФИ как с помощью этого инструмента собрать инсталлятор. Я скачал исходники с сайта, но вот собрать их у меня не получается. Очень-очень прошу помочь. Главное это получить фаил Setup.e32
Автор: NightW0lf
Дата сообщения: 09.01.2007 13:24
Genri

Цитата:
DirExistsWarning (см.в хелпе)


Спасибо работает!

Chanka

Цитата:
Главное это получить фаил Setup.e32

Я так понял тебе нужен именно файл "Setup.e32" - он находится в директории установки (C:\Program Files\Inno Setup 5\Setup.e32) с Inno Setup!


Добавлено:
BAPK

Цитата:
Цитата:Руководство по расширенным возможностям Inno Setup 5 (не для чайников), забираем здесь(3 версия),
новое (4 версия) руководство.

-- file not found...

Перезалил на rl-team.ru

Автор: Chanka
Дата сообщения: 09.01.2007 15:03
NightW0lf,

Цитата:
Я так понял тебе нужен именно файл "Setup.e32" - он находится в директории установки (C:\Program Files\Inno Setup 5\Setup.e32) с Inno Setup!

Я понимаю, что он там находится. Просто я в исходники кое-что добавил. Поэтому мне нужно собрать новый фаил
Автор: NightW0lf
Дата сообщения: 09.01.2007 15:08
Chanka
Я тебе отправил сообщение в личку.
Автор: Genri
Дата сообщения: 09.01.2007 15:12
Chanka

Цитата:
Я скачал исходники с сайта, но вот собрать их у меня не получается. Очень-очень прошу помочь
-- а что значит "помочь"? Научить тебя работе с делфи?

Цитата:
я в исходники кое-что добавил. Поэтому мне нужно собрать новый фаил
-- а нужно ли? Может проще попросить кого-нибудь из тех, кто знает делфи добавить то, что ты хочешь и получить от него готовый файл? А то, может ты такого добавил, что компилятор с перепугу Войну и Мир выдаст, а не экзешник

Автор: maxdddca123
Дата сообщения: 09.01.2007 15:23
Genri
Как добавить кнопочку Печать на страницу где отображается InfoBeforeFile= ???
Автор: Chanka
Дата сообщения: 09.01.2007 15:38
Genri,

Может поможешь? Это тот код, который я тебе присылал. Если ты это сделаешь многие с этого форума будут тебе благодарны. Там работы то на 5 минут для знающего человека вроде тебя
Автор: QuickeneR
Дата сообщения: 09.01.2007 16:42
Genri
Твой пункт 1 не работает. Хинт: innounp -v -m setup.exe
Хотя в распаковщике есть некоторые несогласованности, они не мешают извлечь правильный CompiledCode.
Автор: Genri
Дата сообщения: 09.01.2007 16:48
Chanka -- и ты еще с тех пор не нашел никого поближе, кто смог бы тебе скомпилить ?
Хоть я и не люблю эти рюшечки, но если очень надо, забирай:
http://data.cod.ru/368475594
Проверено. Работает. Для остальных выложи инструкцию по использованию.

Добавлено:
QuickeneR -- согласен. не проверил. учту.


Добавлено:
У меня появился спортивный интерес - запаковать так, чтобы ты не распаковал
Возможно еще пообщаемся. А за анпакер спасибо. Как минимум один раз он мне очень облегчил работу!
Автор: QuickeneR
Дата сообщения: 09.01.2007 17:15
Genri
Чтобы я автоматом не распаковал? Да как два пальца об асфальт
Чтобы руками не смог, хмм... Думаю, можно сделать схему достаточно сложной, чтобы я не стал возиться бесплатно.
Автор: Chanka
Дата сообщения: 09.01.2007 17:27
Genri,

Цитата:
и ты еще с тех пор не нашел никого поближе, кто смог бы тебе скомпилить ?

К сожалению

Цитата:
Проверено. Работает. Для остальных выложи инструкцию по использованию.

Еще бы оно не работало. Я за этот код целое состояние отдал Инструкции таковы: 1. Кидаете этот фаил в папку с инсталлятором
2. Собираете ваш инсталлятор и рядом с ним кладёте папку Res в неё кладёте файлы:
Главная картинка в 4 разрешениях: 1600.jpg, 1280.jpg, 1024.jpg, 800.jpg и фаил с разрешением 640 на 480 под кодовым названием setup.jpg
3 Фаил Cycle.bin обычный текстовый фаил, где указываете, сколько картинок должно показаться пока устанавливается ваша программа. Например
1.jpg
2.jpg
3.jpg
Эти файлы тоже, разумеется, должны находится в этой папке.

Кстати, Genri, сможешь мне выслать исходники как ты там чего сделал? Мне очень надо
Автор: Genri
Дата сообщения: 09.01.2007 18:44
Chanka -- может я чего не понял, но здесь похоже у тебя патченный инсталлятор уже был. А здесь - его у тебя еще как бы и не было...

Ты что, предвидел что я тебе скомпилю и поэтому пообещал на выходных выложить? Так, предсказатель?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

Предыдущая тема: ICONS


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