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

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

Автор: Gnom3
Дата сообщения: 30.12.2012 09:27

Цитата:
Но раз ноу хау, то вопросов нет.

вполне реализуемое ноу-хау. Я видел код оригинала, сам делал такое, немного по другому. ничего сложного, только нудно очень заполнять лейбелы текстом в зависимомти от выбранного языка и текущей страницы. Хотя зависимость от страницы я ни у кого из тех, кто делал этот закос я не видел. А зря, инсталлу легче перерисовать 3-4 лейбела, чем несколько десятков.

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

отчего-же. заменил кнопку комбобоксом и все дела.
Автор: Genri
Дата сообщения: 31.12.2012 22:16
С Новым Годом !!!
Автор: Mailchik
Дата сообщения: 01.01.2013 08:51
Genri, С Новым Счастьем!!
Автор: sergey3695
Дата сообщения: 01.01.2013 10:56
С новой шубкой!
Всех с праздником!
Автор: Sergey_Demchuk
Дата сообщения: 01.01.2013 17:32
Есть следующая задача. Программа вносит в реестр значения в ветку
HKCU\Software\Proga
Нужно через инно также и все эти изменения в реестре применить так же и для других пользователей, которые уже есть в системе а также для пользователя по умолчанию.
Для этого что нужно? Примерно такое.
Просмотреть папку C:\Users на наличие пользователей, внести имена пользователей в переменные.
Далее поочередно загружаем для каждого пользователя куст реестра в HKU\Custom, затем копируем ветки реестра из HKCU\Software\Proga в HKU\Custom, куст реестра выгружаем и так для каждого пользователя.
Пока вот застопорился на том, как получить переменную C:\USERS (у кого то может и на D диске быть), ну и как получить массив переменных с именами учетных записей и DefaultUser, кроме AllUsers
Никто таким извратом не занимался?
Автор: SotM
Дата сообщения: 01.01.2013 19:04
Sergey_Demchuk
Логичный встречный вопрос, а зачем тебе в реестр каждого пользователя записывать?
Разве HKLM недостаточен?
Автор: Sergey_Demchuk
Дата сообщения: 02.01.2013 22:49
SotM
Нет, недостаточно. Программа, на которую делаю инсталлятор, берет настройки только с HKCU, так что для каждого пользователя приходится прописывать в реестре одно и то же.
Автор: SotM
Дата сообщения: 03.01.2013 17:49
Sergey_Demchuk
А не будет ли проблем с доступом к тем веткам реестра? Всегда ли доступны права админа?

Я лично не интересовался как узнать имена всех пользователей в системе, но можно попробовать другой изврат. В ветке реестра HKEY_USERS тупо писать во все доступные подразделы. Насколько это будет адекватный подход - не знаю.
Автор: Sergey_Demchuk
Дата сообщения: 03.01.2013 23:15
Пробовал, игрался с этим, даже коддля инно есть, а оно оказывается не работает...надо таки править реестрт для всех пользователей.
Есть батник, который это реализует и оно работает и весьма неплохо. Думаю, как это покрасивее завернуть в Инно. Единственная неудобность, это Default User в 7-ке. Туда по умолчанию доступ закрыт. Надо становиться владельцем папки, затем вносить изменения в реестр для этого пользователя, затем возвращать владельца обратно.Тоже нетривиальная задача ...
Автор: SotM
Дата сообщения: 04.01.2013 09:57
Sergey_Demchuk
Либо как вариант - добавлять в "одноразовую" автозагрузку каждого пользователя мини программу для внесения изменений в реестр.
Автор: tahirg
Дата сообщения: 05.01.2013 18:55
Мужики, подскажите что нужно написать, чтобы заполнились пустые поля



и если можно озвучте плиз все пункты, которые можно заполнить в "свойствах" файла
"коментарии", что там ещё пишут?

ps очень раздражает, что inno вставляет свой комент в свойства файла, хочется это присечь
Автор: R3Pa4eK
Дата сообщения: 05.01.2013 19:48
tahirg
RESHacker скачай. Вкладка Version Info.
Автор: tahirg
Дата сообщения: 05.01.2013 19:50
R3Pa4eK
умно, я так и делаю, разный софт использовать как то некошерно, хочется средствами инно

Добавлено:
ps2 что написать, чтобы удалялись и папки после распаковки, файлы в них удаляются, а пустые папки остаются
Автор: Sanch8
Дата сообщения: 06.01.2013 12:05
Всех с новым годом. У меня такой вопрос, как наложить текст на кнопку? Вот код:

Код: procedure InfoButtonOnClick(Sender: TObject);
begin
MsgBox('Инфо', mbInformation, MB_OK)
end;

procedure InitializeWizard();
var
BtnPanel: TPanel;
BtnImage: TBitmapImage;

begin
BtnPanel:=TPanel.Create(WizardForm)
with BtnPanel do begin
Left:=40
Top:=450
Width:=81
Height:=22
Cursor:=crHand
OnClick:=@InfoButtonOnClick
Parent:=WizardForm
Caption:= 'Инфо'; // Не работает
end
BtnImage:=TBitmapImage.Create(WizardForm)
with BtnImage do begin
AutoSize:=True
Enabled:=False
ExtractTemporaryFile('Button.bmp')
Bitmap.LoadFromFile(ExpandConstant('{tmp}\button.bmp'));
Parent:=BtnPanel
end
end;
Автор: innonewbie
Дата сообщения: 06.01.2013 15:21
Sanch8, код работает, просто ты на панель (кнопку) накладываешь картинку (Button.bmp), поэтому текста и не видно.
Автор: LordSP
Дата сообщения: 07.01.2013 15:22
Ребят, помогите пожалуйста с таким кодом:

function InitializeSetup(): Boolean;
begin
Result:= True;
if not RegKeyExists(HKLM, 'SOFTWARE\Gameboy(tm) Uneverse\2.3.0')
then
begin
MsgBox('Игране найдена!', mberror, mb_ok);
Result:=False;
exit;
end;
end;

Вроде бы простая проверка, но из-за этих скобок -> (tm) инсталлятор ругается что не найдена программа, хотя она там есть и путь берется отсюда, как сделать чтобы он эти скобки не читал, и не думал что это конец функции? Блин уже не могу с этим =(
Автор: nik1967
Дата сообщения: 07.01.2013 20:47
LordSP, только что проверил - работает код. А ты точно уверен, что у тебя в реестре в разделе Gameboy(tm) Uneverse есть подраздел 2.3.0? Потому, что код проверяет наличие именно этого подраздела в разделе Gameboy(tm) Uneverse.
Автор: LordSP
Дата сообщения: 08.01.2013 06:00
Да точно уверен, дело в том если даже я делал чтобы только проверял этот раздел HKLM, 'SOFTWARE\Gameboy(tm) Uneverse, все хорошо проверяется только тогда, когда я убираю эти скобки (tm), то есть получается так HKLM, 'SOFTWARE\Gameboytm Uneverse -тогда все нормально проверяется, как только ставлю скобки, все пишет не найдена, может дело в том что у меня компилятор Unicode? или система 7 x64?

Добавлено:
Хм странно, дело вот в чем: у меня из-за 64 битной системы игрушка прописывает путь так: (HKLM, 'SOFTWARE\Wow6432Node\Gameboy(tm) Uneverse\2.3.0') ,теперь если указать абсолютный путь то все нормально, ну так а что делать если у пользователя не x64 система!!! Блин раньше был компилятор ANSI,указывал пути как на x32 и все было хорошо, он автоматически прибавлял ветку для x64, теперь Unicode поставил и все, стопор.

Добавлено:
Короче фиг с этой проверкой.....Вот я задался еще таким вопросом, как к пути в реестре (HKLM, 'SOFTWARE\Gameboy(tm) Uneverse\2.3.0', Install Location) прибавить файл в котором находится версия, а он в свою очередь называется Build.txt и находится в {app}, наткнулся на это:

[Code]
function InitializeSetup: Boolean;
var
S: AnsiString;
begin
// Show the contents of Readme.txt (non Unicode) in a message box
ExtractTemporaryFile('Readme.txt');
if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then
begin
MsgBox(S, mbInformation, MB_OK);
end;

Result := True;
end;

Только как это сделать через реестр? и на этапе InitializeSetup выдать сообщение: Текущая версия: 1.2.3.4
Автор: R3Pa4eK
Дата сообщения: 09.01.2013 10:11

Цитата:
Только как это сделать через реестр? и на этапе InitializeSetup выдать сообщение: Текущая версия: 1.2.3.4

Какую ошибку выдает?


Цитата:
а он в свою очередь называется Build.txt и находится в {app}


Цитата:
ExtractTemporaryFile('Readme.txt');
if LoadStringFromFile(ExpandConstant('{tmp}\Readme.txt'), S) then

Если Build.txt и в {app}, то почему Вы грузите с темпа и название файла другое?
Автор: LordSP
Дата сообщения: 09.01.2013 16:14
Да это для примера нарыл пример как прочитать txt файл, но там нет примера как прочитать его через реестр, только и всего, а файл этот Build.txt находится у пользователя на компьютере.
Автор: LordSP
Дата сообщения: 10.01.2013 06:34
И еще ребят, не могу найти тему где был скрипт на создание модального окна с 3 или 4 кнопками, подкажите?
Автор: nik1967
Дата сообщения: 10.01.2013 14:43
LordSP, [more=как то так]
Код: [Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
OutputDir=.

[_code]
function InitializeSetup: Boolean;
var
S: AnsiString;
dir: String;
begin
if not RegKeyExists(HKLM, 'SOFTWARE\Gameboy(tm) Uneverse\2.3.0') then begin
MsgBox('Игра не найдена!', mberror, mb_ok);
Result:= false;
end else begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Gameboy(tm) Uneverse\2.3.0', 'InstallLocation', dir) then
if LoadStringFromFile(AddBackslash(dir) + 'Build.txt', S) and (S <> '') then
MsgBox(S, mbInformation, MB_OK)
else
MsgBox('Версия игры неизвестна!', mbInformation, MB_OK);
Result:= True;
end;
end;
Автор: LordSP
Дата сообщения: 10.01.2013 16:08

Цитата:
Работает и на Ansi и на Unicode'е.

nik1967Спасибо большое. А как сделать модальное окно с 4 кнопками, где то была тема, сейчас уже не могу найти...

Автор: nik1967
Дата сообщения: 10.01.2013 16:16
LordSP, [more=как то так (пример своей формы отмены)]
Код: [Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
OutputDir=.

[_code]
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
var
OkButton, CancelButton: TButton;
MyExit: TSetupForm;
begin
Confirm:= False;
MyExit:= CreateCustomForm();
with MyExit do begin
ClientWidth:= WizardForm.Width-120;
ClientHeight:= WizardForm.Height div 2-50;
Caption:= 'Выход из программы установки';

with TNewStaticText.Create(MyExit) do begin
Left:= ScaleX(95);
Top:= ScaleY(15);
Width:= MyExit.Width-ScaleX(15);
Height:= MyExit.Height div 2-ScaleY(20);
AutoSize:= False;
WordWrap:= True;
Caption:= 'Установка не завершена. Если Вы выйдете,'+#13#10+'игра не будет установлена.'+#13#10+
'Вы сможете завершить установку,'+#13#10+'запустив программу установки позже.'#13#10'Отменить распаковку?';
Parent:= MyExit;
end;

CancelButton:= TButton.Create(MyExit);
with CancelButton do begin
Width:= ScaleX(75);
Height:= ScaleY(23);
Left:= MyExit.Width - Width - 15;
Top:= MyExit.Height - Height * 2 - 13;
Caption:= 'No';
ModalResult:= mrCancel;
Parent:= MyExit;
end;

OkButton:= TButton.Create(MyExit);
with OkButton do begin
Width:= CancelButton.Width;
Height:= CancelButton.Height;
Left:= CancelButton.Left - Width - 5;
Top:= CancelButton.Top;
Caption:= 'Yes';
ModalResult:= mrOk;
Parent:= MyExit;
end;

ActiveControl:= CancelButton;
Center;
end;
if MyExit.ShowModal() = mrCancel then
Cancel:= false
else Cancel:= true;
end;
Автор: LordSP
Дата сообщения: 10.01.2013 16:27
nik1967 Не могу понять, покажи хотя бы на 3, только какая нибудт из кнопок что то делал, удалял папку или в реестр лезла, я вот это имею ввиду
Автор: nik1967
Дата сообщения: 10.01.2013 17:30
LordSP, [more=пример]
Код: [Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
OutputDir=.

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

[_code]
var
OnButton, TwoButton, ThreeButton, CancelButton, MyButton: TButton;
MyCustomForm: TSetupForm;

procedure OnButtonClick(Sender: TObject);
begin
MsgBox('Нажата кнопка 1', mbInformation, MB_OK);
end;

procedure TwoButtonClick(Sender: TObject);
begin
MsgBox('Нажата кнопка 2', mbInformation, MB_OK);
end;

procedure ThreeButtonClick(Sender: TObject);
begin
MsgBox('Нажата кнопка 3', mbInformation, MB_OK);
end;

procedure MyButtonClick(Sender: TObject);
begin
//WizardForm.Hide;
MyCustomForm:= CreateCustomForm();
with MyCustomForm do begin
ClientWidth:= WizardForm.ClientWidth;
ClientHeight:= WizardForm.ClientHeight;
Caption:= 'Пример';

CancelButton:= TButton.Create(MyCustomForm);
with CancelButton do begin
Width:= 75;
Height:= 23;
Left:= WizardForm.CancelButton.Left;
Top:= WizardForm.CancelButton.Top;
Caption:= 'Отмена';
ModalResult:= mrCancel;
Parent:= MyCustomForm;
end;

OnButton:= TButton.Create(MyCustomForm);
with OnButton do begin
Width:= 75;
Height:= 23;
Left:= 115;
Top:= CancelButton.Top;
Caption:= '1';
OnClick:= @OnButtonClick;
Parent:= MyCustomForm;
end;

TwoButton:= TButton.Create(MyCustomForm);
with TwoButton do begin
Width:= 75;
Height:= 23;
Left:= OnButton.Left + Width + 15;
Top:= CancelButton.Top;
Caption:= '2';
OnClick:= @TwoButtonClick;
Parent:= MyCustomForm;
end;

ThreeButton:= TButton.Create(MyCustomForm);
with ThreeButton do begin
Width:= 75;
Height:= 23;
Left:= TwoButton.Left + Width + 15;
Top:= CancelButton.Top;
Caption:= '3';
OnClick:= @ThreeButtonClick;
Parent:= MyCustomForm;
end;

ActiveControl:= CancelButton;
Center;
end;
if MyCustomForm.ShowModal() = mrCancel then MyCustomForm.Free;
//WizardForm.Show;
end;

procedure InitializeWizard();
begin
MyButton:= TButton.Create(WizardForm);
with MyButton do begin
Width:= 75;
Height:= 23;
Left:= 15;
Top:= WizardForm.CancelButton.Top;
Caption:= 'Пример';
OnClick:= @MyButtonClick;
Parent:= WizardForm;
end;
end;
Автор: LordSP
Дата сообщения: 12.01.2013 07:28
nik1967
Спасибо, а как в модальное окно вставить аватарку?

например: MsgBox('Я тут',mbinformation,mb_ok); и картинку в окошке при нажатии
Автор: VlVlV
Дата сообщения: 16.01.2013 09:56
Пожалуйста, помогите адаптировать старый скрипт к новой версии ИС.

Суть в том, чтобы можно было устанавливать без перезагрузки поверх запущенной программы любое количество раз (многие файлы заблокированы). Этот скрипт писал давно, и в старой версии ИС он прекрасно работает, а в самой новой он не выполняет ничего, что от него требуется. Подставлял мсгбоксы в разные места скрипта, и увидел, что идет какая-то задержка передачи аргумента с именем текущего файла. Вместо этого ИС сам пытается удалить файл, естественно не может и выкидывает свое окно: прервать/повтор/пропустить.
Как оказалось, второй скрипт тоже рабочий, просто я запускал готовый инсталятор из под ИС, который у меня портативный, т.е. установка происходила в песочнице, потому и не работало. Удалять не буду, может кому пригодится. Оба скрипта немного доработал.

-----------------------------------------------------------------

inno setup 4.2.7 (все работает)

[Files]
Source: "{app}\1.exe"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall({app}\1.exe)"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\2.exe"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall({app}\2.exe)"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\3.dll"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall({app}\3.dll)"; Flags: ignoreversion uninsrestartdelete

[Code]
var
    FileName: String;
    TempFileName: String;
    TempFileNameFull: String;
    ResultCode: Integer;
    i: Integer;
procedure BeforeFileInstall(FileNameFull: String);
begin
    if FileExists(FileNameFull) then begin
        if DeleteFile(FileNameFull) = False then begin
            FileName := ExtractFileName(FileNameFull);
            if FileName = '2.exe' then begin
                InstExec(AddBackslash(ExpandConstant('{app}')) + 'xxx.exe', '/c', '', True, False, SW_SHOW, ResultCode);
            end;
            if FileName = 'help.chm' then begin
                InstExec(AddBackslash(ExpandConstant('{sys}')) + 'taskkill.exe', '/f /im hh.exe', '', True, False, SW_HIDE, ResultCode);
            end;
            i := 0;
            while i < 5 do begin
                if DeleteFile(FileNameFull) then
                    i := 5
                else
                 i := i + 1;
                 Sleep(1000);
            end;
            if FileExists(FileNameFull) then begin
                TempFileName := ExtractFileName(GenerateUniqueName(FileName, '.tmp'));
                TempFileNameFull := AddBackslash(ExtractFilePath(FileNameFull)) + TempFileName;
                RenameFile(FileNameFull, TempFileNameFull);
                if FileExists(TempFileNameFull) then begin
                    RegWriteStringValue (HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', TempFileName, 'cmd /c del ' + AddQuotes(TempFileNameFull));
                end;
            end;
        end;
    end;
end;

-----------------------------------------------------------------

inno setup 5.5.2 (ошибок нет, но не работает)


[Files]
Source: "{app}\1.exe"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall('1.exe')"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\2.exe"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall('2.exe')"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\3.dll"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall('3.dll')"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\4.dll"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall('4.dll')"; Flags: ignoreversion uninsrestartdelete
Source: "{app}\5.dll"; DestDir: "{app}"; BeforeInstall: "BeforeFileInstall('5.dll')"; Flags: ignoreversion uninsrestartdelete

[Code]
procedure BeforeFileInstall(FileNameFull: String);
var
    FileName: String;
    TempFileName: String;
    TempFileNameFull: String;
    ResultCode: Integer;
    i: Integer;
begin
    FileNameFull := AddBackslash(ExpandConstant('{app}')) + FileNameFull;
    if FileExists(FileNameFull) then begin
        if DeleteFile(FileNameFull) = False then begin
            FileName := ExtractFileName(FileNameFull);
            if FileName = '2.exe' then begin
                Exec(AddBackslash(ExpandConstant('{app}')) + 'xxx.exe', '/c', '', SW_SHOW, ewNoWait, ResultCode);
            end;
            if FileName = 'help.chm' then begin
                Exec(AddBackslash(ExpandConstant('{sys}')) + 'taskkill.exe', '/f /im hh.exe', '', SW_HIDE, ewNoWait, ResultCode);
            end;
            i := 0;
            while i < 5 do begin
                if DeleteFile(FileNameFull) then
                    i := 5
                else
                 i := i + 1;
                 Sleep(1000);
            end;
            if FileExists(FileNameFull) then begin
                TempFileName := ExtractFileName(GenerateUniqueName(FileName, '.tmp'));
                TempFileNameFull := AddBackslash(ExtractFilePath(FileNameFull)) + TempFileName;
                RenameFile(FileNameFull, TempFileNameFull);
                if FileExists(TempFileNameFull) then begin
                    RegWriteStringValue (HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce', TempFileName, 'cmd /c del ' + AddQuotes(TempFileNameFull));
                end;
            end;
        end;
    end;
end;
Автор: aidgest1709
Дата сообщения: 16.01.2013 11:51
Скрипт Need for Speed™ Undercover.iss v 2.4c [Final] не определяет Windows 8.
Что можно сделать? Помогите.
Автор: Doc_Evil
Дата сообщения: 17.01.2013 14:33
Кто может подскажет, как сделать Hint для каждого компонента средствами ResTools? Или это невозможно? Или есть какой-нибудь рабочий вариант с хинтами, чтобы корректно отображался с TreeViewStyle? А то сползают описания компонентов при сворачивании ветки

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177

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


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