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

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

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

Аватара для 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] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2
Скрипты Inno Setup. Помощь и советы [часть 3]
Скрипты Inno Setup. Помощь и советы [часть 4]

Отправлено: 03:49, 21-05-2012

 

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


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

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


alert30,
Да, рядом.


Отправлено: 11:54, 01-03-2013 | #1771



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

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


Аватара для Johny777

Ветеран


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

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


cliff99, у меня всё извлекается. Положил рядом с экзешником инсталла data.arc и выполнил код
сам убедись. Причём у меня ещё кириллица в пути была - моё имя пользователя

читать дальше »
Код: Выделить весь код
[Setup]
AppName=FreeArc Example
AppVerName=FreeArc Example 3.3
DefaultDirName={pf}\FreeArc Example
OutputDir=.

[Components]
Name: "main"; Description: "Main Files";
Name: "help"; Description: "Help Files";

[Files]
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy

[  code]
const
  CP_ACP    = 0;
  CP_UTF8   = 65001;

var
  CancelCode: Integer;

function FreeArcExtract (callback: Longword; cmd1, cmd2, cmd3, cmd4, cmd5, cmd6, cmd7, cmd8, cmd9, cmd10: String): integer; external 'FreeArcExtract@files:unarc.dll cdecl';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpWideCharStr: PAnsiChar; cchWideChar: Integer): Longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: Integer; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpDefaultChar: Integer; lpUsedDefaultChar: Integer): Longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function AnsiToUtf8(const strSource: String): String;
var
  WideCharBuf: String;
begin
  SetLength( WideCharBuf, Length( strSource + chr(0) ) * 2 );
  SetLength( Result, Length( strSource + chr(0) ) * 2 );
  MultiByteToWideChar( CP_ACP, 0, strSource + chr(0), -1, WideCharBuf, Length(WideCharBuf) );
  WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, Result, Length(Result), 0, 0);
end;


function ArcCallBack(what: PAnsiChar; WriteSize, FileSize: Integer; str: PAnsiChar): Integer;
begin
  if (WriteSize <> 0) and (FileSize <> 0) then with WizardForm do
  begin
    WizardForm.ProgressGauge.Position := Round(WizardForm.ProgressGauge.Max*WriteSize/FileSize);
    StatusLabel.Caption := 'Filesize:' + #32 + IntToStr(FileSize) + #32 + 'MB,' + #32 + 'Extracted:' + #32 + IntToStr(WriteSize) + #32 + 'MB';
  end;
  Application.ProcessMessages;
  Result:= CancelCode;
end;

procedure CancelFreeArcextracting(Sedner: TObject);
begin
  CancelCode := -127;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    WizardForm.ProgressGauge.Position := 0;
    with TButton.Create(nil) do
    begin
      Parent := WizardForm.InstallingPage;
      Caption := SetupMessage(msgButtonCancel);
      SetBounds(ScaleX(100), ScaleY(100), ScaleX(75), ScaleY(25));
      OnClick := @CancelFreeArcextracting;
    end;
    WizardForm.ProgressGauge.Max := 100;
    if IsComponentSelected('main') and (CancelCode <> -127) then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8(AddBackslash(ExpandConstant('{src}')) + 'main.arc') , '', '', '', '', '');
  end;
end;

ищи у себя ошибки. С моей стороны всё в порядке!
обновил/улучшил ещё каллбэк функцию. Выделил жирным. Поменяй у себя

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

habib2302,
очень надеюсь, что ты изучишь пример и научишься а не просто возьмёшь готовое
чтоб не плодить благодарственные сообщения и не засорять форум есть кнопка "Полезное сообщение" под каждым сообщением
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:59, 01-03-2013 | #1772


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


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

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


Johny777,
А, да нашёл, извлекает, только не в папку назначения а в c:\setup.
А мне нужно в ту папку, которую я буду указывать в инсталлере
Поэтому я и не видел, что извлекает.
Потом создал архив потяжелее и вижу время повысилось.
и через поиск нашёл.

Отправлено: 14:16, 01-03-2013 | #1773


Ветеран


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

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


Здравствуйте. Была такая идея реализовать страницу с выбором типа установки, по типу - Обычный и Расширенный. По задумке, при выборе обычного типа текст кнопки далее менялся на "Установить", при выборе расширенно менялся обратно на "Далее", соответственно. Собственно реализовать-то получилось, но средствами самих радио-кнопок процедура смены надписи работала криво. Так как при переходе на страницу с выбором типа кнопка "Обычный" уже была выбрана(она checked по умолчанию) текст не менялся. Пришлось запихнуть эту задачу еще и в CurPageChanged. Это конечно не критично, задумка работает, как надо, однако может есть возможность реализовать это, как то по-проще. Кусок скрипта с кастомной страницей и радио-кнопками я прикрепил.

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

[...Code]
var
  SelectInstallModPage: TWizardPage;
  StandardInstallMod: TNewRadioButton;
  ExtendedInstallMod: TNewRadioButton;
  
function CheckExtendedInstallMod: Boolean;
begin
  Result:=ExtendedInstallMod.Checked;
end;

function CheckStandardInstallMod: Boolean;
begin
  Result:=StandardInstallMod.Checked;
end;

procedure StandardInstallModOnClick(Sender: TObject);
begin
  if CheckStandardInstallMod then
  with WizardForm do
  begin
    NextButton.Caption := 'Установка';
  end;
end;

procedure ExtendedInstallModOnClick(Sender: TObject);
begin
  if CheckExtendedInstallMod then
  with WizardForm do
  begin
    NextButton.Caption := 'Далее';
  end;
end;


procedure InitializeWizard();
begin
  SelectInstallModPage := CreateCustomPage(wpInfoBefore, 'Заголовок', 'Подзаголовок');
  StandardInstallMod := TNewRadioButton.Create(nil);
  with StandardInstallMod do
  begin
    Parent := SelectInstallModPage.Surface;
    Left := ScaleX(0);
    Top := ScaleY(80);
    Width := ScaleX(89);
    Height := ScaleY(17);
    Caption := 'Обычный';
    Checked := True;
    OnClick:= @StandardInstallModOnClick;
  end;

  ExtendedInstallMod := TNewRadioButton.Create(nil);
  with ExtendedInstallMod do
  begin
    Parent := SelectInstallModPage.Surface;
    Left := ScaleX(0);
    Top := ScaleY(137);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'Расширенный';
    OnClick:= @ExtendedInstallModOnClick;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = SelectInstallModPage.ID then
  begin
    if CheckStandardInstallMod then
    with WizardForm do
    begin
      NextButton.Caption := 'Установка';
      if CheckExtendedInstallMod then
      with WizardForm do
      begin
        NextButton.Caption := 'Далее';
      end;
    end;
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := False;
  begin
    if CheckStandardInstallMod then
    begin
      if PageID = wpSelectDir then Result := True;
      if PageID = wpSelectComponents then Result := True;
      if PageID = wpSelectProgramGroup then Result := True;
    end;
  end;
end;

Отправлено: 14:33, 01-03-2013 | #1774


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


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

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


Johny777,
Freearc не покатил.
У меня он начинает конфликтовать с isdone.
И как я уже говорил распаковывает не туда куда нужно. (путь то можно исправить, но ладно)
Дело вот в чём.
Основные файлы репака, запакованы freearc, но распаковываются через isdone
Вот они:
Код: Выделить весь код
#ifdef precomp
  PCFVer:={#precomp};
#else
  PCFVer:=0;
#endif
    ISDoneError:=true;
    if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
      repeat
        if not SrepInit('',512,0) then break;
        if not PrecompInit(PCFVer) then break;
        if not FileSearchInit(false) then break;

          if not ISArcExtract    ( 0, 5, ExpandConstant('{src}\LowData.bin'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
          if not ISArcExtract    ( 0, 93, ExpandConstant('{src}\BigData.bin'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
          if not ISArcExtract    ( 0, 2, ExpandConstant('{src}\UpDate.bin'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
То есть три архива по очереди распаковываются. LowData.bin-BigData.bin-UpDate.bin (они же arc, только расширение изменено)
Так можно ли сюда прикрутить этот самый "main.arc" , но только чтобы он распаковывался, когда в компонентах выбран main ?

В самом моём скрипте видно даже пояснение как эти компоненты оформлять.
Код: Выделить весь код
// Подготавливаем переменную содержащую всю информацию о выбранных компонентах для ISDone.dll
// максимум 96 компонентов.
    Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
    TmpValue:=1;
    if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue;     //êîìïîíåíò 1
    TmpValue:=TmpValue*2;
    if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue;     //êîìïîíåíò 2
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue;    //êîìïîíåíò 3
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue;    //êîìïîíåíò 4
//    .....
Я как раз пытаюсь разобраться, но покуда безрезультатно.

Отправлено: 15:10, 01-03-2013 | #1775


Ветеран


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

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


Цитата cliff99:
Так можно ли сюда прикрутить этот самый "main.arc" , но только чтобы он распаковывался, когда в компонентах выбран main ? »
Пример из справки к ISDone, как работать с компонентами.

читать дальше »
Код: Выделить весь код
[...Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive;
Name: text\eng; Description: Английский; Flags: exclusive;
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive;
Name: voice\eng; Description: Английский; Flags: exclusive;

....

Comps1:=0; Comps2:=0; Comps3:=0;
TmpValue:=1;
if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue; //компонент 1
TmpValue:=TmpValue*2;
if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue; //компонент 2
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue; //компонент 3
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue; //компонент 4

....

ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
  repeat
    if not FileSearchInit(false) then break;
    if not ISArcExtract ( 0, 0, ExpandConstant('{src}\BasicData.arc'), ExpandConstant('{app}\'), '', false, '', '', '', notPCFonFLY) then break; //компонент без привязки
    if not ISArcExtract ( 1, 0, ExpandConstant('{src}\rustext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 1
    if not ISArcExtract ( 2, 0, ExpandConstant('{src}\engtext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 2
    if not ISArcExtract ( 3, 0, ExpandConstant('{src}\rusvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 3
    if not ISArcExtract ( 4, 0, ExpandConstant('{src}\engvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 4
    ISDoneError:=false;
  until true;
  ISDoneStop;
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:41, 01-03-2013 | #1776


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


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

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


saurn,
Спасибо, правда уже сам справился. В этой же справке пример взял.
Я с самого начала не правильно вопрос поставил. Нужно было уточнять , что у меня исдоне

Отправлено: 16:05, 01-03-2013 | #1777


Ветеран


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

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


почему в слайдах после завершения установки вечно ругается на эту строчку?
http://i51.fastpic.ru/big/2013/0301/...525f261c8c.png

Отправлено: 20:21, 01-03-2013 | #1778


Аватара для Johny777

Ветеран


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

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


saurn,
Цитата saurn:
может есть возможность реализовать это, как то по-проще »
function CheckStandardInstallMod: Boolean;
function CheckStandardInstallMod: Boolean;
эти функции есть тормоза - в них нет смысла
короче переписал и оптимизировал код, изучай:
читать дальше »

Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: "main"; Description: "Main Files"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Help Files"; Types: full

[  Code]
var
  SelectInstallModPage: TWizardPage;
  StandardInstallMod, ExtendedInstallMod: TNewRadioButton;

procedure InstTyprRadiosOnClick(Sender: TObject);
begin
  case TNewRadioButton(Sender).Caption of
    'Обычный': WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
    'Расширенный': WizardForm.NextButton.Caption := SetupMessage(msgButtonNext);
  end;
end;

procedure InitializeWizard();
begin
  SelectInstallModPage := CreateCustomPage(wpInfoBefore, 'Заголовок', 'Подзаголовок');
  StandardInstallMod := TNewRadioButton.Create(WizardForm);
  with StandardInstallMod do
  begin
    Parent := SelectInstallModPage.Surface;
    SetBounds(ScaleX(0), ScaleY(80), ScaleX(89), ScaleY(17));
    Caption := 'Обычный';
    Checked := True;
    OnClick:= @InstTyprRadiosOnClick;
  end;

  ExtendedInstallMod := TNewRadioButton.Create(nil);
  with ExtendedInstallMod do
  begin
    Parent := SelectInstallModPage.Surface;
    SetBounds(ScaleX(0), ScaleY(137), ScaleX(97), ScaleY(17));
    Caption := 'Расширенный';
    OnClick:= @InstTyprRadiosOnClick;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = SelectInstallModPage.ID then if StandardInstallMod.Checked then WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpReady: Result := StandardInstallMod.Checked;
  end;
end;

для пущей оптимизации можно в обработчике OnClick переключателя писать значения в глобальную булев перемененную и проверять её значение в той же ShouldSkipPage например
вот так:
читать дальше »
Код: Выделить весь код
var
  bStandartInst: Boolean; - глобально 
...

procedure InstTyprRadiosOnClick(Sender: TObject);
begin
  case TNewRadioButton(Sender).Caption of
    'Обычный': 
    begin
        WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
        bStandartInst := True;
...

  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpReady: Result := bStandartInst;
  end;
end;


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

insombia, прежде чем задать вопрос поставь себя мысленно на место того кто может быть тебе ответит и подумай сможет ли он это сделать на основе предоставляемой тобой информации!
по твоему вопросу:
не знаю, установить и посмотреть что не так не могу, хотя уже по скрину видно, что код перегружен. Нафига писать имена слайдов в стринглист, те они 1, 2, 3... Их можно извлесть в цикле и в цикле же грузить из темпа
ну это так навскидку.
в каллбэк функции таймера неточные типы переменных
вот так надо procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
дабы не быть голословным http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
да и смысл в них? Один фиг не используются!

Последний раз редактировалось Johny777, 01-03-2013 в 21:04.

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

Отправлено: 20:58, 01-03-2013 | #1779


Ветеран


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

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


Johny777 там даже в оригинальном скрипте тоже самое выкидывает

Отправлено: 21:05, 01-03-2013 | #1780



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты 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
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход