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

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

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

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

Ветеран


Contributor


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


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

Профиль | Отправить 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

 

Ветеран


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

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


audiofeel, можно создать бевел и внутри него разместить лейбл, чтобы получилась обводка. Я бы оставил так, но это дело вкуса. С таск листом наверное можно что-то сделать, но я незнаю как - с оформлением инсталов я на "вы", больше предпочитаю стандартный спартанский интерфейс.
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:55, 31-03-2013 | #41



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

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


Аватара для alert30

Ветеран


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

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


saurn, в тегах кода скрипта используй [Code] начальная жирная квадратная скобка и не будет конфликты с тегом и прочих символов перед словом Code.
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:15, 31-03-2013 | #42


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


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

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


Всем привет. Помогите пожалуйста с кодом. Нужно внести ключ в реестр в зависимости от разрешения экрана, если FullHD и выше то ключ один, если ниже то ключ другой.

Отправлено: 10:48, 31-03-2013 | #43


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


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

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


Цитата audiofeel:
saurn, скажи те вот а чтобы оное обвести (рамка) придется бевел создавать »
Вот на скорую руку накидал:
Код: Выделить весь код
[*Code]
var
  GroupBox_DirPage: TNewGroupBox;

procedure InitializeWizard();
begin
    GroupBox_DirPage := TNewGroupBox.Create(WizardForm);
    GroupBox_DirPage.Parent := WizardForm.SelectDirPage;
    GroupBox_DirPage.Left := ScaleX(0);
    GroupBox_DirPage.Top := ScaleY(0);
    GroupBox_DirPage.Width := ScaleX(416);
    GroupBox_DirPage. Height := ScaleY(140);
    GroupBox_DirPage.Caption := 'Папка установки';

    WizardForm.SelectDirBitmapImage.Left := ScaleX(10);
    WizardForm.SelectDirBitmapImage.Top := ScaleY(20);
    WizardForm.SelectDirBitmapImage.Parent := GroupBox_DirPage;

    WizardForm.SelectDirLabel.Left := ScaleX(54);
    WizardForm.SelectDirLabel.Top := ScaleY(20);
    WizardForm.SelectDirLabel.Width := ScaleX(300);
    WizardForm.SelectDirLabel.Parent := GroupBox_DirPage;

    WizardForm.SelectDirBrowseLabel.Left := ScaleX(10);
    WizardForm.SelectDirBrowseLabel.Top := ScaleY(54);
    WizardForm.SelectDirBrowseLabel.Width := ScaleX(405);
    WizardForm.SelectDirBrowseLabel.Parent := GroupBox_DirPage;

    WizardForm.DirEdit.Left := ScaleX(10);
    WizardForm.DirEdit.Top := ScaleY(87);
    WizardForm.DirEdit.Width := ScaleX(317);
    WizardForm.DirEdit.Parent := GroupBox_DirPage;

    WizardForm.DirBrowseButton.Left := ScaleX(332);
    WizardForm.DirBrowseButton.Top := ScaleY(86);
    WizardForm.DirBrowseButton.Parent := GroupBox_DirPage;

    WizardForm.DiskSpaceLabel.Left := ScaleX(10);
    WizardForm.DiskSpaceLabel.Top := ScaleY(116);
    WizardForm.DiskSpaceLabel.Width := ScaleX(405);
    WizardForm.DiskSpaceLabel.Parent := GroupBox_DirPage;
end;

-------
Login: Crazy Noise; Copyright ©2013, Crazy Noise.

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

Отправлено: 13:32, 31-03-2013 | #44


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


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

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


Подскажите пожалуйста как лучше организовать инсталлер:

имеется 3 вида компонентов:

компоненты №1 - это компоненты, которые не много занимают места и часто обновляются;
компоненты №2 - это компоненты, которые много занимают и редко обновляются;
компоненты №3 - это компоненты, которые не сильно много места, но больше чем компоненты №1 и не обновляются вообще, ну т.е. устанавливаются только 1 раз в принципе.

Из этого следует, что рационально бы их все устанавливать раздельно, т.е. сделать 3 разных инсталла и обновлять по отдельности, но хочется сделать 1 общий инсталл на всё и в зависимости от того есть ли с инсталлером определённый файл содержащий компонент №1, №2 или №3, предлагало к установке соответствующие компоненты в окне выборов компонентов, т.е. глубо говоря структура была бы такой:
Install.exe - сам установщик
xxx1.xxx - файл с компонентами №1
xxx2.xxx - файл с компонентами №2
xxx3.xxx - файл с компонентами №3

и чтобы xxx1-3.xxx не были просто архивами, чтобы их отдельно нельзя было распаковать. можно ли реализовать такое?

Отправлено: 14:23, 31-03-2013 | #45


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


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

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


habib2302 спасибо за скрипт dead-space-2-fenixx-ot-vasyakrn.7z . Именно єто я искал !!!

Отправлено: 21:23, 31-03-2013 | #46


Аватара для Johny777

Ветеран


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

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


ABBAT,
Цитата ABBAT:
Нужно внести ключ в реестр в зависимости от разрешения экрана, если FullHD и выше то ключ один, если ниже то ключ другой. »
используй методы Width и Height класса TScreen
пример только через код:
читать дальше »
Код: Выделить весь код
procedure InitializeWizard();
begin
  if (Screen.Width >= 1920) and (Screen.Height >= 1080) then RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'Alpha', '1')
  else RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'ShowName', '0');
end;

или так, если используешь секцию [Registry]:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Registry]
// будет внесён если не фулл хд
Root: HKCU; Subkey: "Software\Valve"; ValueType: String; Flags: uninsdeletevalue uninsdeletekeyifempty; Check: not FullHD_or_Higher();

// будет внесён если фулл хд или выше
Root: HKLM; Subkey: "SOFTWARE\Bethesda Softworks\Skyrim"; ValueName: "Installed Path"; ValueType: String; ValueData: "{app}\"; Flags: uninsdeletevalue uninsdeletekeyifempty; Check: FullHD_or_Higher();

[code]
function FullHD_or_Higher(): Boolean;
begin
  Result := (Screen.Width >= 1920) and (Screen.Height >= 1080);
end;


можно и через функцию WinApi GetDeviceCaps(...)
пример:
читать дальше »
Код: Выделить весь код
const
  HORZRES       = 8;     // Horizontal width in pixels
  VERTRES       = 10;    // Vertical height in pixels
  
type
  HDC = LongWord;

  
function GetDeviceCaps(DC: HDC; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function GetDC(hWnd: HWND): HDC; external 'GetDC@user32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';


procedure InitializeWizard();
var
  uHDC: HDC;
begin
  uHDC := GetDC(0);
  try
    if (GetDeviceCaps(uHDC, HORZRES) >= 1920) and (GetDeviceCaps(uHDC, VERTRES) >= 1080) then RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'Alpha', '1')
    else RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'ShowName', '0');
  finally
    ReleaseDC(0, uHDC);
  end;
end;


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

saurn,
Цитата saurn:
по этому самому принципу можно извлечь кол-во необходимого места и из WizardForm.DiskSpaceLabel. Если нет компонентов в инстале.
Так верно? »
молоток, всё верно!

saurn,

Цитата saurn:
Alloc Пост http://forum.oszone.net/post-1932100-239.html»
касательно процентов установки вот тебе пример лучше
у того примера 2 минуса
1. использование необязательной в расширенной версии инно библиотеки innocallback.dll для получения адреса процедуры...
2. использование таймера у которого по умолчанию задержка + он стоит в очередях и задержка может усилиться

для себя уже сделал другой пример, но ещё не выкладывал
принцип такой:
прогрессбар является наследником TWinControl или другим словом он окно, а значит для него действует стандартная оконная функция винды (http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx) ,
как и для всех остальных окон (форма, статик текст и прочие наследники)
но в инно мы к ней по дефоту доступа не имеем и поэтому установим ему свою такую же функцию
дело в том что окно получает сообщения и поле того как оно пройдёт (если пройдёт, тк мы если можем их получать можем и обнулять и прочее) будет выполнен код для этого сообщения (закрыть окно, свернуть, отрисовать нажатие кнопки...) и прогрессбар каждый раз перед отрисовкой новой позиции получает сообщение PBM_SETPOS и именно в этот момент мы можем обновлять проценты перед тем как сообщение пойдёт дальше
пример:

читать дальше »

Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  WM_USER                 = $0400;
  CCM_FIRST               = $2000;
  CCM_SETBKCOLOR          = CCM_FIRST + 1;
  
  PBS_SMOOTH              = 01;
  PBS_VERTICAL            = 04;
  PBM_SETRANGE            = WM_USER+1;
  PBM_SETPOS              = WM_USER+2;
  PBM_DELTAPOS            = WM_USER+3;
  PBM_SETSTEP             = WM_USER+4;
  PBM_STEPIT              = WM_USER+5;
  PBM_SETRANGE32          = WM_USER+6;   // lParam = high, wParam = low
  PBM_GETRANGE            = WM_USER+7;   // lParam = PPBRange or Nil
					 // wParam = False: Result = high
					 // wParam = True: Result = low
  PBM_GETPOS              = WM_USER+8;
  PBM_SETBARCOLOR         = WM_USER+9;		// lParam = bar color
  PBM_SETBKCOLOR          = CCM_SETBKCOLOR;  // lParam = bkColor

  { For Windows >= XP }
  PBS_MARQUEE             = $08;
  PBM_SETMARQUEE          = WM_USER+10;

  { For Windows >= Vista }
  PBS_SMOOTHREVERSE       = $10;

  { For Windows >= Vista }
  PBM_GETSTEP             = WM_USER+13;
  PBM_GETBKCOLOR          = WM_USER+14;
  PBM_GETBARCOLOR         = WM_USER+15;
  PBM_SETSTATE            = WM_USER+16;  { wParam = PBST_[State] (NORMAL, ERROR, PAUSED) }
  PBM_GETSTATE            = WM_USER+17;

  { For Windows >= Vista }
  PBST_NORMAL             = $0001;
  PBST_ERROR              = $0002;
  PBST_PAUSED             = $0003;




  GWL_WNDPROC = -4;


type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
    

function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';

var
  OldProgressBarProc: Longint;

function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
  if Msg =  PBM_SETPOS then with WizardForm.ProgressGauge do WizardForm.Caption := FormatFloat('0.#0 %', (Position*100)/Max);

  Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
  OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;


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

Lex_from_Belarus,
Цитата Lex_from_Belarus:
но хочется сделать 1 общий инсталл на всё и в зависимости от того есть ли с инсталлером определённый файл содержащий компонент №1, №2 или №3, предлагало к установке соответствующие компоненты в окне выборов компонентов »
можно конечно, только сделал проще - не три разных файла с компонентами а один в котором столбиком(обязательно для первой функции, которая закоментирована) или просто перечислены компоненты, те если имя компонента есть в файле, то он будет добален в чеклистбокс, если нет то пропущен
вот пример из двух функций (вторая, которая не закомментирована работает быстрее, но в познавательных целях оставил первую (у меня какая-то странная тяга к массивам и первая на их основе ))

читать дальше »

Код: Выделить весь код
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
SolidCompression=yes
Compression=lzma/ultra


[Components]
Name: A; Description: The Elder Scrolls V - Skyrim; Types: full custom; Flags: disablenouninstallwarning checkablealone fixed; Check: InExternalTextFile('The Elder Scrolls V - Skyrim');
Name: B; Description: на английском языке; Types: full; Flags: exclusive disablenouninstallwarning; Check: InExternalTextFile('на английском языке');
Name: C; Description: на русском языке; Types: full; Flags: exclusive disablenouninstallwarning; Check: InExternalTextFile('на русском языке');

Name: FF; Description: Visual C++ 2010 (x86) (необходим для запуска приложения); Types: full; Flags: dontinheritcheck disablenouninstallwarning; Check: InExternalTextFile('Visual C++ 2010 (x86) (необходим для запуска приложения)');
Name: HL; Description: DirectX; Types: full; Flags: dontinheritcheck disablenouninstallwarning; Check: InExternalTextFile('DirectX');




[Code]
//var
//  Buff: array of String;
//
//function InExternalTextFile(const SearchName: String): Boolean;
//var
//  i: Integer;
//begin
//  if GetArrayLength(Buff) = 0 then if LoadStringsFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff) then
//  for i := 0 to GetArrayLength(Buff)-1 do
//  begin
//    Result := Buff[i] = SearchName;
//    if Result then Break;
//  end;
//end;


var
  Buff: String;

function InExternalTextFile(const SearchName: String): Boolean;
begin
  if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
  Result := Pos(SearchName, Buff) > 0;
end;

для этого примера положи рядом с экзешником инсталла текстовый файл Install.txt содержащий:
The Elder Scrolls V - Skyrim
на английском языке
на русском языке
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:30, 01-04-2013 | #47


Аватара для nik1967

Старожил


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

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


Lex_from_Belarus, а я сделал сложнее (наверное, хотя для меня этот вариант проще). В зависимости от нахождения файла рядом (ну или ещё где - путь задаётся в шапке скрипта) с инсталлятором будет отображаться компонент (ну или не будет). If components exist
Цитата:
и чтобы xxx1-3.xxx не были просто архивами, чтобы их отдельно нельзя было распаковать. можно ли реализовать такое?
Воспользуйся паролем на архив при сжатии.

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

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

Отправлено: 08:37, 01-04-2013 | #48


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


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

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


Johny777, Большое спасибо дружище за примеры (GetDeviceCaps по моему более элегантна)
Ещё вопрос, можно убрать иконку инсталятора с панели задач (не критично просто интересно кто нибудь слышал о током)

Отправлено: 09:19, 01-04-2013 | #49


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


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

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


alert30, Можно и проще.
Посто скопировать в редакторе как UBB-код


получется вот так

Код: Выделить весь код
[Setup]
AppName=My Program
AppVersion=1.5
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: C:\Program Files\Inno Setup 5\Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe; Tasks: desktopicon

[Run]
Filename: {app}\MyProg.exe; Description: {cm:LaunchProgram,My Program}; Flags: nowait postinstall skipifsilent
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:22, 01-04-2013 | #50



Компьютерный форум 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




 
Переход