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

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

 

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

Ветеран


Contributor


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

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


Цитата Johny777:
как системные иконки прикрутить? »
Johny777, держи. На основе твоего предыдущего кода.
читать дальше »

Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
;BitmapResource=Drive:img_small.bmp

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

type
    _ULARGE_INTEGER = record
        LowPart: DWORD;
        HighPart: DWORD;
    end;

    DriveInfo = record
        DriveLetter: String;
        DriveName: String;
        DriveFileSystemName: String;
        DriveSize: Extended;
        DriveFreeSize: array [0..1] of Extended;
        DriveType: String;
    end;

const
    DRIVE_NO_ROOT_DIR = 1;
    DRIVE_REMOVABLE = $2;
    DRIVE_FIXED = $3;
    MAX_PATH = 260;

function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: String; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: _ULARGE_INTEGER): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';
function ExtractIcon(hInst: THandle; lpszExeFileName: String; nIconIndex: UINT): HICON; external 'ExtractIcon{#A}@shell32.dll stdcall';

function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
    except end;
end;


function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
    Result := $7FFFFFFF;
    Result := ((QuadPart.HighPart + integer(QuadPart.LowPart < 0))*Result + QuadPart.HighPart + integer(QuadPart.LowPart < 0))*2 + QuadPart.LowPart;
end;


procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
    i, e: Integer;
    UndefDriveLetter: String;
    DriveType: UINT;
    DrivePath: String;
    VolumeName, FileSystemName: String;
    ComponentLength, SerialNumber, FileSystemFlags: DWORD;
    FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes: _ULARGE_INTEGER;
begin
    for i := 67 to 90 do // Loop from C..Z to determine available drives
    begin
        UndefDriveLetter := Chr(i) + ':\';
        DriveType := GetDriveType(UndefDriveLetter);
        case DriveType of
            DRIVE_REMOVABLE, DRIVE_FIXED: begin
                VolumeName := StringOfChar(#32, MAX_PATH);
                FileSystemName := StringOfChar(#32, MAX_PATH);
                GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
                GetDiskFreeSpaceEx(UndefDriveLetter, FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes);
                if Trim(VolumeName) = '' then VolumeName := 'Без имени';
                SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
                e := GetArrayLength(DriveArray)-1;
                DriveArray[e].DriveLetter := UndefDriveLetter;
                DriveArray[e].DriveName := VolumeName;
                DriveArray[e].DriveFileSystemName := FileSystemName;
                DriveArray[e].DriveSize := Size64(TotalNumberOfBytes);
                DriveArray[e].DriveFreeSize[0] := Size64(TotalNumberOfFreeBytes);
                if DriveArray[e].DriveSize > 0 then DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]*100/DriveArray[e].DriveSize;
                if DriveType = DRIVE_REMOVABLE then DriveArray[e].DriveType := 'Съёмный диск';
                if DriveType = DRIVE_FIXED then if CompareText(UndefDriveLetter, ExpandConstant('{drive:{win}}\')) = 0 then DriveArray[e].DriveType := 'Локальный диск (сис.)' else DriveArray[e].DriveType := 'Локальный диск';
            end;
            DRIVE_NO_ROOT_DIR: Continue;
        end;
    end;
end;


procedure DriveListViewOnClick(Sender: TObject);
begin
    if Assigned(TListView(Sender).Selected) then
        WizardForm.DirEdit.Text := TListView(Sender).Selected.Caption + Copy(WizardForm.DirEdit.Text, 4, Length(WizardForm.DirEdit.Text));
end;

procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
    TListView(Sender).Tag := Column.Index;
    with TListView(Sender) do
    begin
        if DesignInfo = 0 then DesignInfo := 1 else DesignInfo := -DesignInfo;
        AlphaSort;
    end;
end;

procedure DriveListViewOnCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
begin
    with TListView(Sender) do
    begin
        if Tag = 0 then
            Compare := DesignInfo*CompareText(Item1.Caption, Item2.Caption)
        else
            Compare := DesignInfo*CompareText(Item1.SubItems[Tag-1], Item2.SubItems[Tag-1]);
    end;
end;

procedure InitializeWizard;
var
    ReadyArray: array of DriveInfo;
    DriveListView: TListView;
    NewColumn: TListColumn;
    ListItem: TListItem;
    ImgList: TImageList;
    i: Integer;
    ico: TIcon;
begin
    WizardForm.OuterNotebook.Hide;
    WizardForm.Width := ScaleX(700);
    WizardForm.Bevel.Hide;
    WizardForm.DirEdit.Parent := WizardForm;
    WizardForm.DirEdit.SetBounds(ScaleX(27), ScaleY(27), WizardForm.Width-ScaleX(71), ScaleY(21));

    GetDrivesInfo(ReadyArray);

    DriveListView := TListView.Create(nil);
    with DriveListView do
    begin
        Parent := WizardForm;
        ViewStyle := vsReport;
        ReadOnly := True;
        SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + ScaleY(40), WizardForm.DirEdit.Width, ScaleY(200));
        OnClick := @DriveListViewOnClick;
        OnColumnClick := @DriveListViewColumnClick;
        OnCompare := @DriveListViewOnCompare;

        ImgList := TImageList.Create(DriveListView);
        ico := TIcon.Create;
        ico.Handle := ExtractIcon(HInstance, ExpandConstant('{sys}\shell32.dll'), 8);
        ImgList.AddIcon(ico);
        ico.Handle := ExtractIcon(HInstance, ExpandConstant('{sys}\shell32.dll'), 7);
        ImgList.AddIcon(ico);
        ico.Free;
        SmallImages := ImgList;

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Диск';
        NewColumn.Width := ScaleX(65);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Имя';
        NewColumn.Width := ScaleX(90);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Файловая система';
        NewColumn.Width := ScaleX(105);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Ёмкость';
        NewColumn.Width := ScaleX(65);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Свободно';
        NewColumn.Width := ScaleX(90);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Тип';
        NewColumn.Width := ScaleX(130);

        for i := 0 to GetArrayLength(ReadyArray)-1 do
        begin
            ListItem := Items.Add;
            with ListItem do
            begin
                Caption := ReadyArray[i].DriveLetter;
                SubItems.Add(ReadyArray[i].DriveName);
                SubItems.Add(ReadyArray[i].DriveFileSystemName);
                SubItems.Add(BytesToSize(ReadyArray[i].DriveSize));
                SubItems.Add(Format('%s (%d%%)', [BytesToSize(ReadyArray[i].DriveFreeSize[0]), Round(ReadyArray[i].DriveFreeSize[1])]));
                SubItems.Add(ReadyArray[i].DriveType);
                case ReadyArray[i].DriveType of
                    'Локальный диск', 'Локальный диск (сис.)': ImageIndex := 0;
                    'Съёмный диск': ImageIndex := 1;
                else
                    ImageIndex := 1;
                end;
            end;
        end;
    end;
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:49, 18-11-2012 | #1281



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

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


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


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

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


Доброго времени суток.
Не хотел отрывать вас от более продвинутых ситуаций, но буду признателен за помощь.

задача такова:
необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения.
или как это реализовать через [Run], что бы первоначально запускался именно батник.

Спасибо

Отправлено: 18:44, 19-11-2012 | #1282


Аватара для R.i.m.s.k.y.

Ветеран


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

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


ToBeLife, нихао
В справке читай installation order, RUN выполняется самой последней секцией.

Так что через код

Код: Выделить весь код
[Files]
Source: cmd.cmd; DestDir: {tmp}; Flags: ignoreversion noencryption solidbreak dontcopy

[CODE]
var 
res : integer;

procedure InitializeWizard();
begin
  ExtractTemporaryFile(ExpandConstant('cmd.cmd'));
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
  if FileExists(ExpandConstant('{tmp}\cmd.cmd')) then begin
    res := -1;
    Exec('cmd.exe', ' /C ' + ExpandConstant('{tmp}\cmd.cmd'),ExpandConstant('{tmp}'),SW_HIDE,ewWaitUntilTerminated,res);
    if (res > 0) then MsgBox('упс, ошибка выполнения батника' + ExpandConstant('{tmp}\cmd.cmd') + #13#10 + SysErrorMessage(res), mbInformation, MB_OK); 
  end
  else
    MsgBox('упс, файлика ' + ExpandConstant('{tmp}\cmd.cmd') + ' нет', mbInformation, MB_OK);
end; //if CurStep=ssInstall then begin
end;

end. //секции Code
могут быть орфографические ошибки, скобки или запятой не хватать.

Но вообще если батник мелкий лучше его в код инно перенести, а то может быть нестыковка, инно работает в кодировке СР1251, а батник - СР866. Привет ДОСу

-------
Хороший установщик тот, которого не замечаешь
Оформление в инно пустая трата времени: толку мало, головняка много, а ошибок истчо больше!


Последний раз редактировалось R.i.m.s.k.y., 19-11-2012 в 19:15.

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

Отправлено: 19:02, 19-11-2012 | #1283


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


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

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


R.i.m.s.k.y.,
Спасибо за помощь.
Воспользуюсь вашим советом.

Отправлено: 06:24, 20-11-2012 | #1284


Аватара для pritoreanic

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


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

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


Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.

Последний раз редактировалось pritoreanic, 20-11-2012 в 09:37.


Отправлено: 07:01, 20-11-2012 | #1285


Аватара для Johny777

Ветеран


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

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


pritoreanic,
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
DirExistsWarning=no

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

[CustomMessages]
russian.ComponentsDescription0=Наведите курсор мыши на компонент, чтобы прочитать его описание.
russian.ComponentsDescription1=необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения. или как это реализовать через [Run], что бы первоначально запускался именно батник. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.
russian.ComponentsDescription2=В справке читай installation order, RUN выполняется самой последней секцией.
russian.ComponentsDescription3=Но вообще если батник мелкий лучше его в код инно перенести, а то может быть нестыковка, инно работает в кодировке СР1251, а батник - СР866. Привет ДОСу
russian.ComponentsDescription4=Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3;
Name: c\2; Description: 4;

[code]
var
  DescRTV: TRichEditViewer;

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
  DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

procedure InitializeWizard;
begin
  WizardForm.ComponentsList.Width := ScaleX(209);
  WizardForm.ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;

  DescRTV := TRichEditViewer.Create(nil)
  with DescRTV do
  begin
    SetBounds(ScaleX(216), WizardForm.ComponentsList.Top, ScaleX(201), WizardForm.ComponentsList.Height);
    Parent := WizardForm.SelectComponentsPage;
    ReadOnly := True;
    ScrollBars := ssVertical;
  end;
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:04, 20-11-2012 | #1286


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


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

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


Приветствую, может быть вопрос задавался, но все же может кто нибудь ответит как в описании компонентов (как в примере выше), перенести строку описания на новую (ниже), 'описание' + 'описание' не помогает, хотя может не так что то делаю.
Спасибо.

Отправлено: 14:12, 20-11-2012 | #1287


Аватара для pritoreanic

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


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

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


Цитата Johny777:
pritoreanic,
читать дальше » »
Спасибо тебе за код, но возникла проблема при попытке компиляции, выдает ошибку, можешь помочь с проблемой ?


Отправлено: 14:24, 20-11-2012 | #1288


Аватара для Johny777

Ветеран


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

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


pritoreanic, скачай и поставь расширенную версию инно из шапки (ANSI)

JHeavy, так что-ли? описание начинается со слова "описание"
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
DirExistsWarning=no

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

[CustomMessages]
russian.Desc=описание:
russian.ComponentsDescription0=Наведите курсор мыши на компонент, чтобы прочитать его описание.
russian.ComponentsDescription1=необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения. или как это реализовать через [Run], что бы первоначально запускался именно батник. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.
russian.ComponentsDescription2=В справке читай installation order, RUN выполняется самой последней секцией.
russian.ComponentsDescription3=Но вообще если батник мелкий лучше его в код инно перенести, а то может быть нестыковка, инно работает в кодировке СР1251, а батник - СР866. Привет ДОСу
russian.ComponentsDescription4=Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3;
Name: c\2; Description: 4;

[  Code]
var
  DescRTV: TRichEditViewer;

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
  if Index = -1 then DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1)) else DescRTV.Text := CustomMessage('Desc') + ' ' + CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

procedure InitializeWizard;
begin
  WizardForm.ComponentsList.Width := ScaleX(209);
  WizardForm.ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;

  DescRTV := TRichEditViewer.Create(nil)
  with DescRTV do
  begin
    SetBounds(ScaleX(216), WizardForm.ComponentsList.Top, ScaleX(201), WizardForm.ComponentsList.Height);
    Parent := WizardForm.SelectComponentsPage;
    ReadOnly := True;
    ScrollBars := ssVertical;
  end;
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:34, 20-11-2012 | #1289


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


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

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


Johny777, спасибо за ответ, а как сделать чтобы все что после "описание:" начиналось с новой строки типа-
Описание:
1. бла
2. блабла
3. блаблабла
Спасибо.

Отправлено: 14:56, 20-11-2012 | #1290



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




 
Переход