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

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

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

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

Ветеран


Contributor


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


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

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


Изменения
Автор: El Sanchez
Дата: 22-10-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] - Скачать;

  • RegExporter - Фриварная утилита для экспорта реестра и конвертации файлов *.reg и *.ini в инсталляционные скрипты Inno Setup и NSIS.
    Последняя версия: 1.2.0 [23.09.2014] - Скачать;



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

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

Отправлено: 08:52, 02-02-2015

 

Ветеран


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

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


Цитата ZVSRus:
Где прописать не могу найти. »
Содержимое 106-й и 132-й строк в коде замените на:
Код: Выделить весь код
EditTreeView.Text := AddBackslash(DirTreeView.Directory) + ExtractFileName( _szPath );
Если я верно Вас понял.

Отправлено: 22:24, 01-02-2016 | #1281



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

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


Аватара для ZVSRus

Старожил


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

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


saurn,
Цитата:
Содержимое 106-й и 132-й строк в коде замените на:
Может на рисунках будет понятней.

Последний раз редактировалось ZVSRus, 22-03-2016 в 12:35.


Отправлено: 09:12, 02-02-2016 | #1282


Ветеран


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

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


ZVSRus,
Скрытый текст
Имена папок к логике скрипта не имеют никакого отношения. Инсталятору указано автоматически подставлять имя последней папки в пути установки. Данный скрипт вполне самодостаточен, однако имена каталогов в нем указаны, лишь для примера того, как все это будет работать. Как оперировать с именами каталогов в скрипте - это уже ваше дело.
===================================================================================

Код: Выделить весь код
#define Name "Test"

[Setup]
SourceDir=.
OutputDir=Setup
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
DefaultGroupName=Test
OutputBaseFilename=Setup
AllowNoIcons=true

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

[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs createallsubdirs;

[Icons]
Name: {group}\MyProg; Filename: {app}; WorkingDir: {app}

[CustomMessages]
russian.RestoreButton=Сброс

[Code]
var
  ISCustomPage1: TWizardPage;
  Installer: TNewRadioButton;
  Portable: TNewRadioButton;

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  _szPath: String;
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////

procedure RedesignWizardForm;
begin
  ISCustomPage1 := CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');

  { Installer }
  Installer := TNewRadioButton.Create(WizardForm);
  with Installer do
  begin
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(32);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Caption := 'Установка';
    Checked := True;
  end;

  { Portable }
  Portable := TNewRadioButton.Create(WizardForm);
  with Portable do
  begin
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(72);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Caption := 'Распаковка';
  end;

  Installer.TabOrder := 0;
  Portable.TabOrder := 1;
end;

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

const
  DRIVE_CDROM = 5;

var
  BrowseForm: TSetupForm;
  BrowseForm2: TSetupForm;
  DirTreeView: TFolderTreeView;
  DirFolderTreeView: TStartMenuFolderTreeView;
  EditTreeView: TNewEdit;
  EditFolderTreeView: TNewEdit;
  DB_Button: TNewButton;
  GB_Button: TNewButton;
  OldEvent_NoIconsCheckClick: TNotifyEvent;
  OKButton, ButtonNewFolder: TButton;

function GetDriveType(nDrive: string): Longint; external 'GetDriveType{#A}@kernel32.dll stdcall';


////////////////////////////////////////////////////////////////////////////////////////////////
function _szNameLastFolder( const _szPath: String ): String;
{ _szPath: path from which you want to get the name of the last folder }
{ Declared local variables }
var
    _i: Integer;
    _nLen: Integer;
    _szBuff: String;
begin
    _szBuff := RemoveBackslash( _szPath );
    _nLen := Length( _szBuff );

    for _i := _nLen downto 1 do
      begin
          if ( _szBuff[_i] = '\' ) then
            Break; { Stumbled upon a slash , stop the cycle }

          Result := Format( '%s%s', [Result, _szBuff[_i]] );
      end;

    _szBuff := Result;
    Result := '';
    _nLen := Length( _szBuff );

    for _i := _nLen downto 1 do
      Result := Format( '%s%s', [Result, _szBuff[_i]] );
end;
////////////////////////////////////////////////////////////////////////////////////////////////


function CDROM(Drive: String): Boolean;
begin
  Result:= GetDriveType(Drive) = 5;
end;

procedure GetDrive(Sender: TObject);
var
  Path, Path1: String;
begin
  Path:= ExtractFileDrive(DirTreeView.Directory);
  Path1:= ExtractFileDrive(EditTreeView.Text);
  ButtonNewFolder.Enabled:= not CDROM(Path);
  OKButton.Enabled:= not CDROM(Path1);
    if CDROM(Path1) then MsgBox('Установка на выбранный диск невозможна!', mbError, MB_OK);
end;

procedure DirTreeViewChange(Sender: TObject);
begin
  if DirTreeView.Directory <> WizardForm.DirEdit.Text then begin

    /////////////////////////////////////////////////////////////////////////////////////////////////////////
    EditTreeView.Text := AddBackslash(DirTreeView.Directory) + _szNameLastFolder( _szPath );
    /////////////////////////////////////////////////////////////////////////////////////////////////////////

    GetDrive(nil);
  end else
    EditTreeView.Text := DirTreeView.Directory;
end;

procedure DirFolderTreeViewChange(Sender: TObject);
begin
  if DirFolderTreeView.Directory <> WizardForm.GroupEdit.Text then
  EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}' else
  EditFolderTreeView.Text := DirFolderTreeView.Directory;
end;

procedure BrowseFormButtonsTreeViewOnClick(Sender: TObject);
begin
  case TButton(Sender).Tag of
    1:  begin

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    EditTreeView.Text := _szPath;
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    GetDrive(nil);
  end;
    2:  begin
    DirTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    EditTreeView.Text := AddBackslash(DirTreeView.Directory) + _szNameLastFolder( _szPath );
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        end;

    3:  if EditTreeView.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := EditTreeView.Text;
  end;
end;

procedure BrowseFormButtonsFolderTreeViewOnClick(Sender: TObject);
begin
  case TButton(Sender).Tag of
    4:  EditFolderTreeView.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#Name}'));

    5:  begin
          DirFolderTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
          EditFolderTreeView.Text := AddBackslash(DirFolderTreeView.Directory) + '{#Name}';
        end;

    6:  if EditFolderTreeView.Text <> WizardForm.GroupEdit.Text then WizardForm.GroupEdit.Text := EditFolderTreeView.Text;
  end;
end;

procedure BrowseDirTreeViewClick(Sender: TObject);
begin
  BrowseForm := CreateCustomForm();
  with BrowseForm do
  begin
    Width := ScaleX(413);
    Height := ScaleY(361);
    Caption := SetupMessage(msgBrowseDialogTitle);
    Position := poScreenCenter;

    with TLabel.Create(nil) do
    begin
      SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
      Caption := SetupMessage(msgBrowseDialogLabel);
      Parent := BrowseForm;
      Font.Size := 8;
    end;

    DirTreeView := TFolderTreeView.Create(nil)
    with DirTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
      OnChange := @DirTreeViewChange;
      Parent := BrowseForm;
    end;

    EditTreeView := TNewEdit.Create(nil);
    with EditTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
      Text := DirTreeView.Directory;
      Parent := BrowseForm;
      Font.Color := clWindowText;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonCancel);
      ModalResult := mrCancel;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm;
      Caption := ExpandConstant('{cm:RestoreButton}');
      Tag := 1;
      OnClick := @BrowseFormButtonsTreeViewOnClick;
    end;

    ButtonNewFolder:= TButton.Create(nil)
    with ButtonNewFolder do
    begin
      SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonNewFolder);
      Tag := 2;
      OnClick := @BrowseFormButtonsTreeViewOnClick;
    end;

    OKButton:= TButton.Create(nil);
    with OKButton do
    begin
      SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonOK);
      Tag := 3;
      OnClick := @BrowseFormButtonsTreeViewOnClick;
      ModalResult := mrOk;
    end;

    DirTreeView.ChangeDirectory(AddBackslash(WizardForm.DirEdit.Text), True);
    ShowModal;
    Free;
  end;
end;

procedure BrowseDirFolderTreeViewClick(Sender: TObject);
begin
  BrowseForm2 := CreateCustomForm();
  with BrowseForm2 do
  begin
    Width := ScaleX(413);
    Height := ScaleY(361);
    Caption := SetupMessage(msgBrowseDialogTitle);
    Position := poScreenCenter;

    with TLabel.Create(nil) do
    begin
      SetBounds(ScaleX(12), ScaleY(12), ScaleX(207), ScaleY(16));
      Caption := SetupMessage(msgBrowseDialogLabel);
      Parent := BrowseForm2;
      Font.Size := 8;
    end;

    DirFolderTreeView := TStartMenuFolderTreeView.Create(nil)
    with DirFolderTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(64), ScaleX(375), ScaleY(225));
      SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{userstartup}'),ExpandConstant('{commonstartup}'));
      OnChange := @DirFolderTreeViewChange;
      Parent := BrowseForm2;
    end;

    EditFolderTreeView := TNewEdit.Create(nil);
    with EditFolderTreeView do
    begin
      SetBounds(ScaleX(16), ScaleY(36), ScaleX(376), ScaleY(21));
      Text := DirFolderTreeView.Directory;
      Parent := BrowseForm2;
      Font.Color := clWindowText;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(16), ScaleY(301), ScaleX(90), ScaleX(23));
      Parent := BrowseForm2;
      Caption := SetupMessage(msgButtonCancel);
      ModalResult := mrCancel;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(111), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm2;
      Caption := ExpandConstant('{cm:RestoreButton}');
      Tag := 4;
      OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(206), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm2;
      Caption := SetupMessage(msgButtonNewFolder);
      Tag := 5;
      OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(301), ScaleY(301), ScaleX(90), ScaleY(23));
      Parent := BrowseForm2;
      Caption := SetupMessage(msgButtonOK);
      Tag := 6;
      OnClick := @BrowseFormButtonsFolderTreeViewOnClick;
      ModalResult := mrOk;
    end;

    DirFolderTreeView.ChangeDirectory(AddBackslash(WizardForm.GroupEdit.Text), True);
    ShowModal;
    Free;
  end;
end;

procedure NoIconsCheckClick(Sender: TObject);
 begin
   OldEvent_NoIconsCheckClick(Sender);
   GB_Button.Enabled := not WizardForm.NoIconsCheck.Checked;
 end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
  OldEvent_NoIconsCheckClick := WizardForm.NoIconsCheck.OnClick;
  WizardForm.NoIconsCheck.OnClick := @NoIconsCheckClick;

  WizardForm.DirBrowseButton.Hide;
  DB_Button := TNewButton.create(WizardForm);
  with DB_Button do
  begin
    Parent := WizardForm.SelectDirPage;
    SetBounds(WizardForm.DirBrowseButton.Left, WizardForm.DirBrowseButton.Top, WizardForm.DirBrowseButton.Width, WizardForm.DirBrowseButton.Height - ScaleY(1));
    Caption := SetupMessage(msgButtonBrowse);
    OnClick := @BrowseDirTreeViewClick;
  end;

  WizardForm.GroupBrowseButton.Hide;
  GB_Button := TNewButton.create(WizardForm);
  with GB_Button do
  begin
    Parent := WizardForm.SelectProgramGroupPage;
    SetBounds(WizardForm.GroupBrowseButton.Left, WizardForm.GroupBrowseButton.Top, WizardForm.GroupBrowseButton.Width, WizardForm.GroupBrowseButton.Height - ScaleY(1));
    Caption := SetupMessage(msgButtonBrowse);
    OnClick := @BrowseDirFolderTreeViewClick;
  end;
end;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
      wpSelectDir:
      begin
          case Installer.Checked of
              False: _szPath := ( AddBackslash(ExpandConstant('{src}')) + '{#Name}Portable' );
              True: _szPath := RemoveBackslashUnlessRoot(ExpandConstant('{#SetupSetting("DefaultDirName")}') );
          end;

          WizardForm.DirEdit.Text := _szPath;
      end;
  end;
end;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D003010C403000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D6550616765084E65787450616765070D4953437573746F6D50616765310D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E7365506167650C50726576696F757350616765070D4953437573746F6D50616765310D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6F6B506167650D53656C65637
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:47, 02-02-2016 | #1283


Аватара для habib2302

Ветеран


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

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


Доброе время суток. помогите решить проблему с этим компонентом.
Код: Выделить весь код
Name: AFP\I; Description: Установить {#MyAppName}; Flags: disablenouninstallwarning; Types: full;
Потому, что если указать этот компонент в командной строке, то получается вот что.

ИЛИ
или подскажите как сделать так, чтобы при выборе 1-го или нескольких этих компонентов
Код: Выделить весь код
[Components]
Name: AFP\I\AX; Description: Для Internet Explorer; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\NPAPI; Description: Для AOL, Firefox, Netscape, Opera; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\PPAPI; Description: Для платформы Chromium; Flags: disablenouninstallwarning; Types: full;
снималась галочка с этого компонента
Код: Выделить весь код
[Components]
Name: AFP\I\ALL; Description: Для Всех Браузеров; Flags: disablenouninstallwarning; Types: full;
и становился неактивным. и так на оборот.

Скрипт

-------
Помог? От "Полезное сообщение" не откажусь!!!


Последний раз редактировалось habib2302, 04-02-2016 в 11:41.


Отправлено: 12:03, 03-02-2016 | #1284


Аватара для Dodakaedr

Ветеран


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

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


Цитата habib2302:
или подскажите как сделать »
Скрытый текст
Код: Выделить весь код
#define MyAppName "My Program"
#define MyAppVersion "1.5"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Components]
Name: AFP; Description: {#MyAppName}; Flags: fixed disablenouninstallwarning; Types: full;
Name: AFP\I; Description: Установить {#MyAppName}; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\AX; Description: Для Internet Explorer; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\NPAPI; Description: Для AOL, Firefox, Netscape, Opera; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\PPAPI; Description: Для платформы Chromium; Flags: disablenouninstallwarning; Types: full;
Name: AFP\I\ALL; Description: Для Всех Браузеров; Flags: disablenouninstallwarning; Types: full;

[code]
procedure checking(sender: tobject);
begin
if WizardForm.ComponentsList.Checked[5] = true then
begin
WizardForm.ComponentsList.Checked[2] := false;
WizardForm.ComponentsList.ItemEnabled[2] := false;
WizardForm.ComponentsList.Checked[3] := false;
WizardForm.ComponentsList.ItemEnabled[3] := false;
WizardForm.ComponentsList.Checked[4] := false;
WizardForm.ComponentsList.ItemEnabled[4] := false;
end else begin
WizardForm.ComponentsList.ItemEnabled[2] := true;
WizardForm.ComponentsList.ItemEnabled[3] := true;
WizardForm.ComponentsList.ItemEnabled[4] := true;
end;
if (WizardForm.ComponentsList.Checked[2] or WizardForm.ComponentsList.Checked[3] or WizardForm.ComponentsList.Checked[4]) then
begin
WizardForm.ComponentsList.Checked[5] := false;
WizardForm.ComponentsList.ItemEnabled[5] := false;
end else
WizardForm.ComponentsList.ItemEnabled[5] := true;
end;

procedure InitializeWizard();
begin
  WizardForm.ComponentsList.Checked[2] := false;
  WizardForm.ComponentsList.Checked[3] := true;
  WizardForm.ComponentsList.Checked[4] := false;
  WizardForm.ComponentsList.Checked[5] := false;
  WizardForm.ComponentsList.ItemEnabled[5] := false;
  WizardForm.ComponentsList.OnClickCheck := @checking;
end;

-------
Inno Setup 5 Ultra Unicode

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

Отправлено: 20:29, 04-02-2016 | #1285


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


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

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


Помогите пожалуйста со скриптом (или хотя бы ссылкой, где описано решение).
Задача такая:
1. создать простой установщик (на данном этапе проблем не возникает)
2. установщик должен заменить файлы (в разных директориях) и сделать бэкап оригиналов в отдельную папку
3. при деинсталляции оригинальные файлы должны вернуться обратно на свои места

Отправлено: 15:17, 05-02-2016 | #1286


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


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

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


Подскажите, как сделать, чтобы после установки программы, она не просила регистрацию?
То есть если у меня уже зарегестрированная версия, она же и перенеслась на другой комп.

Отправлено: 12:01, 06-02-2016 | #1287


Аватара для Dodakaedr

Ветеран


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

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


Цитата a.k.a. Rasputin:
Задача такая: »
Решение такое:
Скрытый текст
Код: Выделить весь код
#define MyAppName "My Program"
#define MyAppVersion "1.5"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
OutputDir=.

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Files]
Source: "{app}\1.txt"; DestDir: "{app}\txt"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
Source: "{app}\2.txt"; DestDir: "{app}"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
Source: "{app}\1.cjstyles"; DestDir: "{app}\cjstyles"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
Source: "{app}\1.rtf"; DestDir: "{app}\txt"; BeforeInstall: "BackupFile()"; Flags: ignoreversion
Source: "{app}\1.zip"; DestDir: "{app}\zip"; BeforeInstall: "BackupFile()"; Flags: ignoreversion

[code]
type
#ifdef UNICODE
#define A "W"
PChar = PAnsiChar;
#else
#define A "A"
#endif
   TSHFileOpStruct =  record
     Wnd: HWND;
     wFunc: UINT;
     pFrom: PChar;
     pTo: PChar;
     fFlags: Word; 
     fAnyOperationsAborted: BOOL;
     hNameMappings: HWND; 
     lpszProgressTitle: PChar; 
   end;
   
const
   FO_MOVE            = $0001;
   FO_COPY            = $0002;
   FOF_SILENT         = $0004;
   FOF_NOCONFIRMATION = $0010;
   FOF_FILESONLY      = $0080;
   FOF_NOCONFIRMMKDIR = $0200;

function SHFileOperation(const lpFileOp: TSHFileOpStruct):Integer; external 'SHFileOperation@shell32.dll stdcall';

procedure BackupFile();
var
file, backFile, backpath: string;
begin
if FileExists(ExpandConstant(CurrentFileName)) then
begin
File := ExpandConstant(CurrentFileName);
backpath := file;
StringChangeEx(backpath, ExpandConstant('{app}'), '', True);
backFile := ExpandConstant('{app}\Backup') + backpath;
ForceDirectories(ExtractFilePath(backfile));
RenameFile(file, backfile);
end;
end;

function BackupDir(const fromDir, toDir: ansistring; IsMove: Boolean): Boolean;
var
  fos: TSHFileOpStruct;
  _fromDir, _toDir: ansistring;
  SR: TFindRec;
  res: Boolean;
begin
    ForceDirectories(toDir);
  if IsMove then
    fos.wFunc  := FO_MOVE else
    fos.wFunc  := FO_COPY;
    fos.fFlags := FOF_FILESONLY or FOF_SILENT or
               FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;
    _fromDir:= AddBackslash(fromDir);
    _toDir  := AddBackslash(toDir);
  if (Length(fromDir) = Length(_fromDir)) then
    begin
        res:= FindFirst(_fromDir + '*', SR);
      try
        while res do
        begin
          if (SR.Name <> '') and (SR.Name <> '.') and (SR.Name <> '..') then
          begin
            if SR.Attributes = FILE_ATTRIBUTE_DIRECTORY then
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir + #0#0;
                fos.pFrom  := PChar(_fromDir);
                fos.pTo    := PChar(_toDir);
              end else
              begin
                _fromDir:= _fromDir + SR.Name + #0#0;
                _toDir  := _toDir   + SR.Name + #0#0;
                fos.pFrom  := PChar(_fromDir);
                fos.pTo    := PChar(_toDir);
              end;
                Result := (0 = ShFileOperation(fos));
                _fromDir:= ExtractFilePath(_fromDir);
                _toDir:= ExtractFilePath(_toDir);
          end;
          res := FindNext(SR);
        end;
      finally
        FindClose(SR);
      end;
    end else
    begin
      _fromDir:= RemoveBackslashUnlessRoot(_fromDir) + #0#0;
      _toDir  := RemoveBackslashUnlessRoot(_toDir)   + #0#0;
      fos.pFrom  := PChar(_fromDir);
      fos.pTo    := PChar(_toDir);
      Result := (0 = ShFileOperation(fos));
    end;
end;

procedure RestoreBackup(backDir: string);
begin
BackupDir(backDir, ExpandConstant('{app}'), True);
DelTree(backDir, true, true, true);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usdone then
begin
RestoreBackup(ExpandConstant('{app}\Backup\'));
end;
end;


Цитата djbionicl:
То есть если у меня уже зарегестрированная версия, она же и перенеслась на другой комп. »
Определите где программа хранит свои рег. данные и занесите их в свой установщик. Как это сделать можно найти в интернете.

-------
Inno Setup 5 Ultra Unicode

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

Отправлено: 18:57, 06-02-2016 | #1288


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


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

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


Dodakaedr,
от души благодарю! Скрипт работает. А то я сижу второй день, вчитываюсь в документацию.
Если вас не затруднит, подскажите пожалуйста, каким образом сделать так, чтобы путь установки брался из реестра? В реестре же в упор не нахожу ключей, которые бы указывали путь.

Отправлено: 19:49, 06-02-2016 | #1289


Аватара для Dodakaedr

Ветеран


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

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


Цитата a.k.a. Rasputin:
чтобы путь установки брался из реестра? В реестре же в упор не нахожу ключей, которые бы указывали путь. »
Путь берется из ключа реестра деинсталлятора. В справке в разделе "Константы" есть небольшое описание получения значения.
Код: Выделить весь код
[setup]
appname=app
appvername=app 1.0
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup 5_is1,InstallLocation|{pf}\My Program}

-------
Inno Setup 5 Ultra Unicode

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

Отправлено: 20:20, 06-02-2016 | #1290



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 7] El Sanchez Автоматическая установка приложений 2499 02-02-2015 08:59
Скрипты Inno Setup. Помощь и советы [часть 6] El Sanchez Автоматическая установка приложений 2494 10-03-2014 11:51
Скрипты 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




 
Переход