Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 6]

Закрытая тема
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 6]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Отправлено: 19:06, 28-03-2013

 

Аватара для nik1967

Старожил


Сообщения: 440
Благодарности: 251

Профиль | Сайт | Отправить PM | Цитировать


Shkutu, для этого в Inno есть секция [CustomMessages].
Если я правильно понял
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

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

[CustomMessages]
rus.interface=Интерфейс
rus.choice=Выберите компоненты, которые вы хотите установить.

eng.interface=Interface
eng.choice=Select components which you want to set.

[_Code]
var
  Page: TWizardPage;

procedure InitializeWizard;
begin
  Page:=CreateCustomPage(wpWelcome, ExpandConstant('{cm:interface}'), ExpandConstant('{cm:choice}'));
end;


Наткнулся на скрипт, который писал неизвестно когда и неизвестно кому . Может пригодится кому.
MyCoustomExit
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
OutputDir=.

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

[CustomMessages]
rus.ExitSetupTitle1=Вы уверены, что хотите выйти из программы установки?
eng.ExitSetupTitle1=Quit the setup program?

[_code]
const
  ID_QUESTION = 65579;

var
  MyCoustomExit: TPanel;
  YesButton,NoButton: TButton;
  IsExit: boolean;
  PageNameLabel2,PageDescriptionLabel2: TNewStaticText;
  MyExitLabel: TLabel;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:= false;
end;

procedure MyCoustomCancelClick(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:= IsExit;
  MyCoustomExit.Show;
  NoButton.Show;
  YesButton.Show;
  WizardForm.Bevel.Parent:= MyCoustomExit;
  WizardForm.Bevel1.Parent:= MyCoustomExit;
end;

procedure NoButtonClick(Sender: TObject);
begin
  IsExit:= false;
  MyCoustomExit.Hide;
  NoButton.Hide;
  YesButton.Hide;
  WizardForm.Bevel.Parent:= WizardForm;
  WizardForm.Bevel1.Parent:= WizardForm.InnerPage;
end;

procedure YesButtonClick(Sender: TObject);
begin
  IsExit:= True;
  WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
end;

procedure InitializeWizard();                       
begin
  MyCoustomExit:= TPanel.Create(WizardForm);
  with MyCoustomExit do begin
    Parent:= WizardForm;
    SetBounds(ScaleX(0),ScaleY(0),WizardForm.Width,WizardForm.Height);

    with TNewIconImage.Create(WizardForm) do begin
      Parent:= MyCoustomExit;
      Left:= ScaleX(230);
      Top:= ScaleY(85);
      Icon.Handle := ID_QUESTION;
    end;

    PageNameLabel2:= TNewStaticText.Create(MyCoustomExit); 
    with PageNameLabel2 do begin
      Parent:= MyCoustomExit;
      SetBounds(WizardForm.PageNameLabel.Left,WizardForm.PageNameLabel.Top,WizardForm.PageNameLabel.Width,WizardForm.PageNameLabel.Height);
      Font.Style:= [fsBold];
      Caption:= SetupMessage(msgExitSetupTitle);      
    end;

    PageDescriptionLabel2:= TNewStaticText.Create(MyCoustomExit);
    with PageDescriptionLabel2 do begin
      Parent:= MyCoustomExit;
      SetBounds(WizardForm.PageDescriptionLabel.Left,WizardForm.PageDescriptionLabel.Top,WizardForm.PageDescriptionLabel.Width,WizardForm.PageDescriptionLabel.Height);
      Caption:= CustomMessage('ExitSetupTitle1');
    end;

    MyExitLabel:= TLabel.Create(MyCoustomExit); 
    with MyExitLabel do begin
      Parent:= MyCoustomExit;
      SetBounds(ScaleX(0),ScaleY(150),WizardForm.Width,ScaleY(80));
      AutoSize:= False;
      WordWrap:= True;
      Alignment:= taCenter;
      Caption:= SetupMessage(msgExitSetupMessage);      
    end;

    NoButton:= TButton.Create(MyCoustomExit);
    with NoButton do begin
      Parent:= WizardForm;
      SetBounds(WizardForm.CancelButton.Left,WizardForm.CancelButton.Top,WizardForm.CancelButton.Width,WizardForm.CancelButton.Height);
      Caption:= SetupMessage(msgButtonNo);
      OnClick:= @NoButtonClick;
    end;

    YesButton:= TButton.Create(MyCoustomExit);
    with YesButton do begin
      Parent:= WizardForm;
      SetBounds(WizardForm.NextButton.Left,WizardForm.NextButton.Top,WizardForm.NextButton.Width,WizardForm.NextButton.Height);
      Caption:= SetupMessage(msgButtonYes);
      OnClick:= @YesButtonClick;
    end;
  end;
end;

Procedure CurPageChanged(CurPageID: Integer);
begin
  MyCoustomExit.Hide;
  NoButton.Hide;
  YesButton.Hide;
  WizardForm.OnCloseQuery:=@MyCoustomCancelClick;
end;
Единственное "но" - при стандартной распаковке при нажатии на "Отмена" не останавливается распаковка.

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".


Последний раз редактировалось nik1967, 15-08-2013 в 11:04.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:08, 14-08-2013 | #1021



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


volga163@vk, сделал
читать дальше »
Код: Выделить весь код
[Files]
Source: config.ini; DestDir:{app}; Check: INI_InDestFolder();


[code  ]
#define A = (Defined UNICODE) ? "W" : "A"

const
    TEST_REG_SUB_KEY = 'Control Panel\My App\Test';
    TEST_INI_FILE_NAME = 'config.ini';
    TEST_REG_VALUE_NAME = 'ID';
    TEST_REG_VALUE = 'ID';

///////////////////////////////////////

const
    ERROR_SUCCESS          = 0;

    STANDARD_RIGHTS_ALL    = $001F0000;
    KEY_QUERY_VALUE        = $0001;
    KEY_SET_VALUE          = $0002;
    KEY_CREATE_SUB_KEY     = $0004;
    KEY_ENUMERATE_SUB_KEYS = $0008;
    KEY_NOTIFY             = $0010;
    KEY_CREATE_LINK        = $0020;
    SYNCHRONIZE            = $00100000;

    KEY_ALL_ACCESS = (STANDARD_RIGHTS_ALL or KEY_QUERY_VALUE or KEY_SET_VALUE or KEY_CREATE_SUB_KEY or KEY_ENUMERATE_SUB_KEYS or KEY_NOTIFY or KEY_CREATE_LINK) and not SYNCHRONIZE;

    READ_CONTROL           = $00020000;
    STANDARD_RIGHTS_READ   = READ_CONTROL;

    KEY_READ = (STANDARD_RIGHTS_READ or KEY_QUERY_VALUE or KEY_ENUMERATE_SUB_KEYS or KEY_NOTIFY) and not SYNCHRONIZE;

    REG_EXPAND_SZ          = 2;

    SINGLE_CHAR_SIZE       = 2;


type
    ACCESS_MASK = DWORD;
    REGSAM = ACCESS_MASK;
    HKEY = LongWord;
    Pointer = Longint;
    PByte = Pointer;
    PDWORD = Pointer;


function RegCreateKeyEx(hKey: HKEY; lpSubKey: String; Reserved: DWORD; lpClass: String; dwOptions: DWORD; samDesired: REGSAM; lpSecurityAttributes: Longint;
  var phkResult: HKEY; var lpdwDisposition: DWORD): Longint; external 'RegCreateKeyEx{#A}@advapi32.dll stdcall';
function RegSetValueEx(hKey: HKEY; lpValueName: String; Reserved: DWORD; dwType: DWORD; lpData: Pointer; cbData: DWORD): Longint; external 'RegSetValueEx{#A}@advapi32.dll stdcall';
function RegCloseKey(hKey: HKEY): Longint; external 'RegCloseKey@advapi32.dll stdcall';
function RegOpenKeyEx(hKey: HKEY; lpSubKey: String; ulOptions: DWORD; samDesired: REGSAM; var phkResult: HKEY): Longint; external 'RegOpenKeyEx{#A}@advapi32.dll stdcall';
function RegQueryValueEx(hKey: HKEY; lpValueName: String; lpReserved: Pointer; lpType: PDWORD; lpData: PByte; lpcbData: PDWORD): Longint; external 'RegQueryValueEx{#A}@advapi32.dll stdcall';


function CreateRegKey(const hKey: HKEY; const lpSubKey: String; out phkResult: HKEY): Boolean;  // phkResult - хэндл открытого ключа. Нам он пригодится
var
    lpdwDisposition: DWORD;
begin
    Result := RegCreateKeyEx(hKey, lpSubKey, 0, '', 0, KEY_ALL_ACCESS, 0, phkResult, lpdwDisposition) = ERROR_SUCCESS;
end;


function hSetRegExpandStringValue(const hKeyOpened: HKEY; const ValueName, Value: String): Boolean; // сюда в hKeyOpened отправляем открытый хэндл, чтоб не открывать новый
begin
    Result := RegSetValueEx(hKeyOpened, ValueName, 0, REG_EXPAND_SZ, CastStringToInteger(Value), (Length(Value) + 1) * SINGLE_CHAR_SIZE) = ERROR_SUCCESS;
end;


function WinApi_RegKeyExists(const hKey: HKEY; const lpSubKey: String): Boolean;
var
    phkResult: HKEY;
begin
    Result := RegOpenKeyEx(hKey, lpSubKey, 0, KEY_READ, phkResult) = ERROR_SUCCESS;
    if Result then RegCloseKey(phkResult);
end;


function WinApi_RegKeyValueExists(const hKey: HKEY; const lpSubKey, lpValueName: String): Boolean;
var
    phkResult: HKEY;
begin
    if RegOpenKeyEx(hKey, lpSubKey, 0, KEY_READ, phkResult) = ERROR_SUCCESS then
    try
        Result := RegQueryValueEx(phkResult, lpValueName, 0, 0, 0, 0) = ERROR_SUCCESS;
    finally
        RegCloseKey(phkResult);
    end;
end;


function INI_InDestFolder(): Boolean;
var
    hKeyOpened: DWORD;
begin
    Result := not FileExists(  AddBackslash( ExpandConstant('{app}') ) + TEST_INI_FILE_NAME  );  // файл будет установлен, если его нет в директории установки

    // если нет ветки Control Panel\My App\Test' (убрал под константу TEST_REG_SUB_KEY), в разделе HKEY_CURRENT_USER то создаём её
    if not WinApi_RegKeyExists(HKEY_CURRENT_USER, TEST_REG_SUB_KEY) then
    begin
        CreateRegKey(HKEY_CURRENT_USER, TEST_REG_SUB_KEY, hKeyOpened); // создаём ветку
        hSetRegExpandStringValue(hKeyOpened, TEST_REG_VALUE_NAME, TEST_REG_VALUE); // те ветки не было то не было и ключа, создаём и его
    end else // в противном случае если ветка есль, то проверям наличие там ключа
    if not WinApi_RegKeyValueExists(HKEY_CURRENT_USER, TEST_REG_SUB_KEY, TEST_REG_VALUE_NAME) then //если ключа нет
      Result := hSetRegExpandStringValue(hKeyOpened, TEST_REG_VALUE_NAME, TEST_REG_VALUE); // то создаём его
end;


работа с реестром здесь на чистом WinApi (!)

Тестируй!

=================================================================

nik1967, файл иконки необязательно таскать с собой. Её можно брать у винды. Посмотри в примере "Создание кастомного диалогового окна", в шапке.

Последний раз редактировалось Johny777, 15-08-2013 в 00:37.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:29, 15-08-2013 | #1022


Аватара для tr011_tmn

Ветеран


Автор проектов


Сообщения: 1002
Благодарности: 295

Профиль | Отправить PM | Цитировать


Цитата Johny777:
верно, слетит только папка Redist с её содержимым »
проверил работает на ура, спасибо огромное.

Задачка на логику по работе с SelectComponent. Помогите решить, а то сам даже не знаю как подступиться.

Инсталлятор у меня включает 12 компонентов видимых пользователю, на его выбор, 2 из них под флагом Fixed, остальные по желанию пользователя. Но есть важный нюанс. При выборе более трех компонентов по выбору требуется что бы независимо от желания пользователя в папку {app} копировался специальный набор файлов. оптимизирующий работу этих выбранных компонентов.

Если на пальцах то:

при установке только компонентов с флагом Fixed: не копируем
при установке компонентов с флагом Fixed + 1-2 компонента по выбору: не копируем
при установке компонентов с флагом Fixed + 3 и более компонентов: копируем

Заранее благодарен за помощь

-------
Насяльника!!!!! Джамшута адроннама коллайдер фключал, ключ павирнул и ашельбе машельбе асин, вульшарьбелеме!! и полный пистесама насяльника!
Цирк уехал ))) клоуны остались


Отправлено: 07:54, 15-08-2013 | #1023


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Есть проблема: установка с параметрами silent и verysilent не работает (видимо из-за прочих плюшек во время установки). Можно ли как-то решить эту проблему (установить в тихом режиме)? Спасибо.

Отправлено: 09:00, 15-08-2013 | #1024


Аватара для nik1967

Старожил


Сообщения: 440
Благодарности: 251

Профиль | Сайт | Отправить PM | Цитировать


Johny777, благодарю! От иконки избавился, скрипт переписал. Оказалось ещё, что на ANSI не отображается бевел на панели выхода - исправил. Хотя сам пользуюсь UNICODE версией Inno.

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".


Отправлено: 11:09, 15-08-2013 | #1025


Аватара для icq99999999

Пользователь


Сообщения: 86
Благодарности: 3

Профиль | Отправить PM | Цитировать


Цитата Johny777:
Код: »
а с помощью какой команды скрыть все окна инстала ?

Отправлено: 17:05, 15-08-2013 | #1026


Ветеран


Сообщения: 510
Благодарности: 51

Профиль | Отправить PM | Цитировать


icq99999999,
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID =wpSelectComponents) or (PageID =wpSelectProgramGroup) or (PageID =wpready) or (PageID =wpfinished) then
Result:= True;
end;
или
[setup]
DisableDirPage = yes
и т д

Отправлено: 18:19, 15-08-2013 | #1027


Ветеран


Сообщения: 510
Благодарности: 51

Профиль | Отправить PM | Цитировать


icq99999999
procedure InitializeWizard();
begin
wizardform.WelcomeLabel1.hide;
и т д, можно ещё вообще все скрыть со страницы,если хочешь создать свою страницу

procedure InitializeWizard();
begin
with WizardForm do begin
InnerNotebook.Hide;
OuterNotebook.Hide;
Bevel.Hide;
end;

Последний раз редактировалось insombia, 15-08-2013 в 19:42.


Отправлено: 19:24, 15-08-2013 | #1028


Аватара для icq99999999

Пользователь


Сообщения: 86
Благодарности: 3

Профиль | Отправить PM | Цитировать


Цитата insombia:
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID =wpSelectComponents) or (PageID =wpSelectProgramGroup) or (PageID =wpready) or (PageID =wpfinished) then
Result:= True;
end; »
что то не получается данный код скрывает только последние страницы а мне нужно чтоб был тихий установщик

Отправлено: 21:29, 15-08-2013 | #1029


Ветеран


Сообщения: 510
Благодарности: 51

Профиль | Отправить PM | Цитировать


icq99999999 гугл помогает на ура,вот например,если что ищи ещё там
http://forum.ru-board.com/topic.cgi?...767&start=1520

Отправлено: 21:52, 15-08-2013 | #1030



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 6]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59




 
Переход