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

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

Автор: NightW0lf
Дата сообщения: 25.12.2006 22:21
Genri
Ты меня немного не понял мне надо, переименновать кнопки только на странице "Установки"! (В руководстве от Kindly есть пример такой пример для страницы приветствия, НО у меня не получается таким способом сделать это на странице установки!)
Вот тот из руководства пример:

Код:
//Чтобы назначить собственный текст кнопок страниц мастера пишем следующую процедуру.
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpWelcome then
begin
If WizardForm.FindComponent('NextButton') is TButton
then
TButton(WizardForm.FindComponent('NextButton')).Caption:='Вперед >>>';
If WizardForm.FindComponent('CancelButton') is TButton
then
TButton(WizardForm.FindComponent('CancelButton')).Caption:='Выход';
end;
end;
Автор: Genri
Дата сообщения: 25.12.2006 22:27
maxdddca123 -- откровенно говоря, мне не совсем понятно, что у тебя получилось. А лазить по нескольким страницам и кропотливо восстанавливать скрипт, который есть у тебя, мне не очень хочется. Дай скрипт целиком, возможно и помогу.


Добавлено:
NightW0lf -- я не совсем понимаю, что ты называешь страницей установки. wpInstalling ? Но там вроде видна только одна кнопка.

На всякий случай:
Код:
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInstalling then
begin
WizardForm.CancelButton.Caption:= 'Отменить';
WizardForm.NextButton.Caption:= 'Вперед';
WizardForm.BackButton.Caption:= 'Назад';
end;
end;
Автор: GRom V
Дата сообщения: 26.12.2006 05:54
Genri

function InitializeSetup(): Boolean;
var
sn: String;
begin
sn:= SerialNumberHDD(0,0);
If GetMD5OfString(sn) <> '5218f6dd539ebf07d7ccc4cdd9f8d274' then
begin
MsgBox('Please Check Licence!', mbInformation, mb_OK);
Exit;
end;
Result:=True;
end;

Как провести проверку нескольких серийников - если хоть один совпадает то все ОК, т.е инсталлятор запустится
Автор: maxdddca123
Дата сообщения: 26.12.2006 06:08
Genri
Пожалуйста, значит вот рисуется чек бокс лист, и в него вставляется список всех путей баз 1С, которые прописаны в реестре:

NewCheckListBox1 := TNewCheckListBox.Create(Page);
with NewCheckListBox1 do
begin
Parent := Page.Surface;
if RegGetValueNames(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names) then
begin
SetArrayLength(Value,GetArrayLength(Names));
for I := 0 to GetArrayLength(Names)-1 do
begin
RegQueryStringValue(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names[I], Value[I]);

NewCheckListBox1.AddCheckBox(Value[I], Names[I], 0, False, True, False, False, nil);
end;
end;
Left := ScaleX(0);
Top := ScaleY(56);
Width := ScaleX(413);
Height := ScaleY(170);
TabOrder := 0;
end;

Теперь мне нужно, что бы после нажатия кн Далее определялось, какие чек боксы отметил пользователь. Напомню, что значения Value[i] это массив путей (C:\Program Files\1Cv например). И затем, после того, как определились отмеченные чекбоксы, нужно, что бы инсталлятор распаковывал файлы поочерёдно в каждую дирректорию, которую отметил пользователь. Вот собсна и всё. Жду вашей помощи.
Автор: QuickeneR
Дата сообщения: 26.12.2006 08:33
Kindly
Ну и в чем проблема? Прекрасно выдирается хоть фаром, хоть командной строкой
innounp -x -m kppp10-0.bin embedded\CompiledCode.bin
Автор: GRom V
Дата сообщения: 26.12.2006 09:09
Все - Понял:
function InitializeSetup(): Boolean;
var
sn: String;
begin
sn:= SerialNumberHDD(0,0);
If (GetMD5OfString(sn) <> '5218f6dd539ebf07d7ccc4cdd9f8d274') and (GetMD5OfString(sn) <> '5218f6dd539ebf07d7ccc4cdd9f8d277') and (GetMD5OfString(sn) <> '5218f6dd539ebf07d7ccc4cdd9f8d270') then
begin
MsgBox('Please Check Licence!', mbInformation, mb_OK);
Exit;
end;
Result:=True;
end;
Автор: Genri
Дата сообщения: 26.12.2006 11:00
GRom V

Цитата:
Все - Понял
--
Я бы сделал примерно так:

Код:
function InitializeSetup(): Boolean;
var
sn: String;
begin
sn:= GetMD5OfString(SerialNumberHDD(0,0));
case sn of
'd8578edf8458ce06fbc5bb76a58c5ca4' : Result:= True;
'a152e841783914146e4bcd4f39100686' : Result:= True;
'b427ebd39c845eb5417b7f7aaf1f9724' : Result:= True;
'76419c58730d9f35de7ac538c2fd6737' : Result:= True;
'8aef4d1f64d6dd481bec830faa0de8b2' : Result:= True;
else Result:= False;
end;

if Not Result then
begin
MsgBox('Please Check Licence!', mbInformation, mb_OK);
Exit;
end;
end;
Автор: maxdddca123
Дата сообщения: 26.12.2006 12:53
Genri
Ну а мне помочь ? Я же всё вам выложил . Или ещё что то требуется ?
Автор: Kindly
Дата сообщения: 26.12.2006 17:18
QuickeneR

Цитата:
Ну и в чем проблема? Прекрасно выдирается хоть фаром, хоть командной строкой
innounp -x -m kppp10-0.bin embedded\CompiledCode.bin
Ну об таких параметрах не знал (embedded\CompiledCode.bin). Спасибо, вопрос закрыт.

Genri

Цитата:
Я бы порекомендовал, не использовать опубликованный в инете пароль.

Мне в принципе по барабану. В будущем вообще запароливать не буду. Насчет новозашифрованного инсталлера, то мне вроде как пока нечего сказать.
Автор: Frenzzy
Дата сообщения: 27.12.2006 01:07
Добрые люди, очень нужна ваша помощь.

мне нужно создать дистрибутив с сетевой игрой, которая обновляется примерно рас в месяц для ~50 неопытных пользователей (ламеров)
сейчас в игру играет только ~30 чел, которые разобрались в достаточно сложной установке и обновлениях для игры.

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

1. Инсталлятор должен быть одним exe файлом
2. Должен уметь скачивать с сетевого ftp сервера игровые файлы + к этому должен уметь устанавливать только изменившиеся файлы, а еще лучше чтоб он мог работать как патч (заменять только изменившиеся байты)
3. Чтоб этим же инсталлятором можно было бы также обновить игру (т.е. он просто скачает новые файлы и(или) перезапишет изменившиеся файлы - это конечно не обязательно, но было бы не плохо
4. При установке инсталлятор должен спросить NickName, который потом должен записаться в INI файл. (это тоже не обязательно)

ну вот собственно самые главные вещи я перечислил, если мне кто-нибудь поможет этому человеку будут благодарны ~80 малоопытных юзеров, а возможно и больше, т.к. моя сеть очень быстро растет и развивается

вот я начал наметывать инсталл:


Цитата:
[Setup]
AppName=Counter-Strike Source
AppVerName=Counter-Strike Source
DefaultDirName={sd}\Steam
DefaultGroupName=Steam
VersionInfoCompany=ORiNET Team
VersionInfoTextVersion=01.10.2006
VersionInfoVersion=1.0.0.31
WizardImageFile=left.bmp
WizardSmallImageFile=top.bmp

[Languages]
Name: ru; MessagesFile: "Russian.isl"

[INI]
Filename: "{app}\sbrev.ini"; Section: "SETTINGS"; Key: "AppsPath"; String: "{app}\SteamApps\SBReV"
Filename: "{app}\sbrev.ini"; Section: "SETTINGS"; Key: "SteamAppsPath"; String: "{app}\SteamApps"
Filename: "{app}\sbrev.ini"; Section: "SETTINGS"; Key: "UserName"; String: "Player"
Filename: "{app}\sbrev.ini"; Section: "SETTINGS"; Key: "AppsLanguage"; String: "Russian"
Filename: "{app}\sbrev.ini"; Section: "240_cstrike"; Key: "parameters"; String: "-console"
...и т.п.

[Files]
...все игровые файлы должны скачиваться с сетевого ftp сервера, и я не знаю как это сделать :'(

[Icons]
Name: "{group}\Steam Buster Revolution"; Filename: "{app}\sbrev.exe"; WorkingDir: "{app}"
Name: "{group}\Counter-Strike Source"; Filename: "{app}\sbrev.exe"; WorkingDir: "{app}"; Parameters: "-applaunch 240"; IconFilename: "{app}\counter-strike source.ico"
Name: "{group}\Uninstall"; Filename: "{uninstallexe}"; WorkingDir: "{app}"
Name: "{userdesktop}\SBReV"; Filename: "{app}\sbrev.exe"; WorkingDir: "{app}"

[Setup]
UninstallDisplayIcon=css.vsev.ico
SetupIconFile=css.vsev.ico


..возможно я бы и сам все сделал изучив справку, но она не запускается в Windows Vista :'(
Автор: GRom V
Дата сообщения: 27.12.2006 01:50
Genri

Цитата:
Я бы сделал примерно так:


Спасибо действительно удобно!

Добавлено:
Может кто нить подсказать как сделать backup реестра (нескольких веток) и сохранить в нужном месте в виде reg-файла?
Был бы очень признателен.
Автор: Denis_Kokyev
Дата сообщения: 27.12.2006 02:33

Цитата:
Может кто нить подсказать как сделать backup реестра (нескольких веток) и сохранить в нужном месте в виде reg-файла?


Например я так делал:

[Run]
Filename: {sys}\dllcache\regedit.exe; Parameters: -EA {win}\cursors\beeline\backup.reg "HKEY_CURRENT_USER\Control Panel\Cursors"; WorkingDir: {sys}; StatusMsg: Внесение изменений в реестр...;
Автор: GRom V
Дата сообщения: 27.12.2006 03:34
Denis_Kokyev

Цитата:
Например я так делал:

[Run]
Filename: {sys}\dllcache\regedit.exe; Parameters: -EA {win}\cursors\beeline\backup.reg "HKEY_CURRENT_USER\Control Panel\Cursors"; WorkingDir: {sys}; StatusMsg: Внесение изменений в реестр...;


Я не так выразился - мне нужно сделать backup реестра (нескольких веток) и сохранить в нужном месте в виде reg-файла ПЕРЕД ИНСТАЛЛЯЦИЕЙ
Был бы признателен
Автор: Denis_Kokyev
Дата сообщения: 27.12.2006 06:21
GRom V
Перед инсталяцией - процедурой Procedure BeforeInstall;
Вот пример:


Код:
[Code]
var
ResultCode: Integer;
Procedure MyBeforeInstall;
Begin
Exec(ExpandConstant('{pf}\QIP\Skins\{code:GetSkinName}\Smilies\DirRen.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
end;

[Files]
Source: "C:\123\Animated1\*.ini"; DestDir: "{app}"; BeforeInstall: MyBeforeInstall; Flags: ignoreversion; Components: first
Автор: QuickeneR
Дата сообщения: 27.12.2006 07:04
Frenzzy

Цитата:
..возможно я бы и сам все сделал изучив справку, но она не запускается в Windows Vista :'(

Скачай последнюю версию Inno Setup, там справка в chm.

На английском, естественно.
Автор: GRom V
Дата сообщения: 27.12.2006 07:13
Denis_Kokyev

Цитата:
Код:
[Code]
var
ResultCode: Integer;
Procedure MyBeforeInstall;
Begin
Exec(ExpandConstant('{pf}\QIP\Skins\{code:GetSkinName}\Smilies\DirRen.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
end;

[Files]
Source: "C:\123\Animated1\*.ini"; DestDir: "{app}"; BeforeInstall: MyBeforeInstall; Flags: ignoreversion; Components: first



Чето я не вкурю - ну и где сдесь backup хоть какойто ветки реестра???
Автор: Frenzzy
Дата сообщения: 27.12.2006 09:48
К сожалению в англ. я не силен

а в англ. справке я не нашел как сделать, чтоб установочные файлы скачивались с ftp..

..походу мне никто не поможет :'(
Автор: omals
Дата сообщения: 27.12.2006 10:12
2 Frenzzy


Цитата:
а в англ. справке я не нашел как сделать, чтоб установочные файлы скачивались с ftp..


вот тут есть хороший скрипт
http://www.sherlocksoftware.org/page.php?id=50
просто инклудиш его в свой скрипт.
но я еще не проверял будет ли он работать если установлен фаервол.

также можно использовать
http://www.istool.org/default.aspx/isx/isxdl
тоже нормально работает

и там и там есть примеры использования
Автор: Frenzzy
Дата сообщения: 27.12.2006 10:45
omals
Спасибо тебе Друг БОЛЬШОЕ! Пойду разбираться..
Автор: Genri
Дата сообщения: 27.12.2006 10:57
maxdddca123

Цитата:
Ну а мне помочь ?
-- пока не могу найти красивого решения по установке в несколько папок. Экспериментировал со следующим:
Source: Files\*; DestDir: {code:CurrentDir}; Check: ChangeDir
Но вылезла любопытная фича:
1. Сначала запускается функция ChangeDir (выставляется в True и меняется путь)
2. Вызывается CurrentDir
... а дальше любопытно...
3. Так как путь изменился... опять вызывается Check: ChangeDir
4. Если False - файлы не копируются, а если True... опять вызывается CurrentDir
5. ... и так по кругу. Но из клинча, как ни странно, на каком-то шаге выходит.

Будет время - повожусь еще.




Немного разобрался. В конструкции:

Source: Files\*; DestDir: {code:CurrentDir}; Check: ChangeDir
Source: Files\*; DestDir: {code:CurrentDir}; Check: ChangeDir

1. Сначала вызывается Check: ChangeDir для каждого! файла в Files\*
2. пункт 1 повторяется для второй строки (я так понимаю, вычисляются файлы которые удовлетворяют условию и строится список устанавливаемых файлов)
3. Опять вызывается Check: ChangeDir и если True - вызывается code:CurrentDir
4. пункт 3 повторяется для каждого! файла
5. пункты 3 и 4 повторяются для второй строки
Автор: omals
Дата сообщения: 27.12.2006 11:46
GRom V

Цитата:
Я не так выразился - мне нужно сделать backup реестра (нескольких веток) и сохранить в нужном месте в виде reg-файла ПЕРЕД ИНСТАЛЛЯЦИЕЙ
Был бы признателен

можно в InitializeSetup запустить .bat file который сделает бекап
пример как такой батник написать кажись есть тут
www.robvanderwoude.com/regedit.html

а можно просто писать свою процеду (запускать из того же InitializeSetup)
в ней читать нужное из реестра и затем писать в текстовый файл
правда там нужно будет повозится з форматом строк, но это детали.

или я шото не так понял?
Автор: Chanka
Дата сообщения: 27.12.2006 11:59
Genri,

А что с моим вопросом? Неужели за столько время ничего не получилось? Здаётся мне что код, который я тебе дал надо вставлять не в скрипт, а в исходники Inno Setup. Попробуй, пожалуйста. Так как я не программист и с Delphi работать не умею. А ты просто герой форума
Автор: Genri
Дата сообщения: 27.12.2006 12:40
maxdddca123 -- попробуй следующее:
Код:
[Files]
Source: Files\*; DestDir: {code:CurrentDir|0}; Check: NeedCopy(0)
Source: Files\*; DestDir: {code:CurrentDir|1}; Check: NeedCopy(1)
Source: Files\*; DestDir: {code:CurrentDir|2}; Check: NeedCopy(2)
Source: Files\*; DestDir: {code:CurrentDir|3}; Check: NeedCopy(3)
Source: Files\*; DestDir: {code:CurrentDir|4}; Check: NeedCopy(4)
Source: Files\*; DestDir: {code:CurrentDir|5}; Check: NeedCopy(5)

[Code]
var
Names: TArrayOfString;
Value: TArrayOfString;
Page: TInputOptionWizardPage;

function NeedCopy(Param: integer): Boolean;
begin
if (Param < Page.CheckListBox.Items.Count) and
Page.CheckListBox.Checked[Param] then
begin
Result:= True;
end;
end;

function CurrentDir(Param: string): string;
begin
if Page.CheckListBox.Checked[StrToInt(Param)] then
Result:= Page.CheckListBox.ItemCaption[StrToInt(Param)]
else Result:= '';
end;


procedure InitializeWizard();
var
I: Integer;
S: String;
begin
Page := CreateInputOptionPage(wpWelcome,
'Выберите компоненты', 'Какие компоненты хотите установить?',
'Выберите необходимые компоненты и нажмите далее.',
False, True);

if RegGetValueNames(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names) then
begin
SetArrayLength(Value,GetArrayLength(Names));
for I := 0 to GetArrayLength(Names)-1 do
begin
RegQueryStringValue(HKEY_CURRENT_USER, 'Software\1C\1Cv7\7.7\Titles', Names[I], Value[I]);
Page.CheckListBox.AddCheckBox(Names[I], Value[I], 0, True, True, False, False, nil);
end;
end else
begin
MsgBox('Ошибка!', mbInformation, MB_OK);
end;
end;
Автор: Denis_Kokyev
Дата сообщения: 27.12.2006 13:25
omals
Ну да - можно и так сделать, с помощью bat файла такого содержания
(GRom V это может быть то что нужно):

start /wait regedit /ea Save1.reg "HKEY_CURRENT_USER\Software\Programs1"
start /wait regedit /ea Save2.reg "HKEY_CURRENT_USER\Software\Programs2"
start /wait regedit /ea Save3.reg "HKEY_CURRENT_USER\Software\Programs3"
copy Save1.reg+Save2.reg+Save3.reg

В файл Save1.reg будут скопированы все остальные файлы, что вроде и требовалось.

GRom V
Вот и я не в курю - я первый раз привел процедуру сохранения ветки
реестра средствами InnoSetup, второй - как что запускать до выполнения
скрипта. Сопоставить религия не позволяет?
Автор: maxdddca123
Дата сообщения: 27.12.2006 14:59
Genri
Спасибо, на счёт кол-ва путей тут конечно некрасиво. Оно же равно GetArrayLength(Names) я так понимаю. Сколько путей отметили, столько и папок будет в итоге.... Это можно как то всё реализовать через массив исключительно ? ПРосто у меня есть клиент, у которого 150 путей......
Автор: Genri
Дата сообщения: 27.12.2006 15:18
maxdddca123

Цитата:
есть клиент, у которого 150 путей
-- т.е. он работает со 150 базами? Оригинально. К сожалению, способа решить проблему другим стандартным способом, я не знаю. Можно, конечно, организовать копирование полностью через код. Но тогда придется прописывать весь интерфейс (ход установки, прогрес-бар и т.д.).

Но в конце концов, добавь 200 строк и поэкпериментируй. В дистрибутиве файлы все равно по умолчанию хранятся в одном экземпляре. Так что на размер это не повлияет.
Автор: maxdddca123
Дата сообщения: 27.12.2006 15:29
Genri
Хм, ландно попробую. Ещё такой ньюанс: например на странице готовности пишется, что папка распаковки C:\windows... Тут можно сделать, что бы писались те папки, которые выбраны ?
Автор: omals
Дата сообщения: 27.12.2006 15:33
2 Genri maxdddca123

думаю, можно решить следующим способом
каждую базу со всеми каталогами архивируем например с 7z
будет в результате
archiv1.7z .... archiv10.7z ... archivN.7z
7zip тащим с собой в инсталке
в инсталке разархивируем в темп
а потом тупо через
xcopy /Y /R "шо копировать" "куда копировать"
копируем все содержимое

если у клиента много компов на которые надо ставить базы и все пути там разные, то
для каждого компа пишеться свой текстовый файл с этими путями
и передается инсталке как параметр
инсталка его парсит и ставит шо кому надо.
кстати инно позволяет инсталить и на удаленные машины
тоесть админ с одной тачки простым запуском батника может проинсталить прогу на все компы в сети (зная их айпишки(имена) конечно же). нужно только нормально прописать батник.
Автор: Genri
Дата сообщения: 27.12.2006 15:44
maxdddca123

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

Здесь смотри
omals

Цитата:
каждую базу со всеми каталогами архивируем например с 7z
-- Ну во-первых база одна (один набор файлов). Просто копировать надо одно и тоже в разные места. Проблема в том, что кол-во этих мест на этапе компиляции неизвестно. Вариант с самораспаковывающимся архивом пришел в голову в первую очередь. Но тогда, как я и говорил, самому надо прописывать весь интерфейс отображения хода установки. А это уже не так интересно
Автор: maxdddca123
Дата сообщения: 27.12.2006 15:45
omals

Цитата:
каждую базу со всеми каталогами архивируем например с 7z

Дак обновление надо распаковать в базы, зачем их куда то копировать...


Добавлено:
Genri

Цитата:
можно сделать, что бы писались те папки, которые выбраны ?
Здесь смотри

Честно - не понял причём тут изменение старницы готовности к установке и данная Вами ссылка. Вы меня не так наверно поняли. Меня интересует страница ГОТОВНОСТИ, а не страница дирректории. Я её вообще отключил. А на странице готовности пишется, что путь установки C:\Windows, а нужно, что бы выводились те пути, которые выбрал юзер галочками.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

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


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