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

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

 

Аватара для Johny777

Ветеран


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

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


Пацаны! Скажите пожалуйста чем можно заменить указатель в той или иной функции. Те например нужно воспользоваться вин апи функцией, а у неё один из входных параметров указатель
например function CopyFileEx(lpExistingFileName, lpNewFileName: PWideChar; lpProgressRoutine: TFNProgressRoutine; lpData: Pointer; pbCancel: PBool; dwCopyFlags: DWORD): BOOL; stdcall;
очень привлекательная функция которая может отображать прогресс копирования файла (суть не конкретно в ней, тк есть многo других с указателями)
но каким образом использовать её в инно. Как вообще поступать с Pointer-ом. В Windows.pas (Embarcadero RAD Studio/ Delphi 2010) они на каждом углу. Просветите меня пожалуйста на этот счёт!
читать дальше »
Код: Выделить весь код
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
{ Define possible return codes from the CopyFileEx callback routine }

  PROGRESS_CONTINUE = 0;
  //EXTERNALSYM PROGRESS_CONTINUE
  PROGRESS_CANCEL = 1;
  //EXTERNALSYM PROGRESS_CANCEL
  PROGRESS_STOP = 2;
  //EXTERNALSYM PROGRESS_STOP
  PROGRESS_QUIET = 3;
  //EXTERNALSYM PROGRESS_QUIET
  
{ Define CopyFileEx callback routine state change values }

  CALLBACK_CHUNK_FINISHED = $00000000;
  //EXTERNALSYM CALLBACK_CHUNK_FINISHED
  CALLBACK_STREAM_SWITCH = $00000001;
  //EXTERNALSYM CALLBACK_STREAM_SWITCH


{ Define CopyFileEx option flags }

  COPY_FILE_FAIL_IF_EXISTS = $00000001;
  //EXTERNALSYM COPY_FILE_FAIL_IF_EXISTS
  COPY_FILE_RESTARTABLE = $00000002;
  //EXTERNALSYM COPY_FILE_RESTARTABLE

type
  Pointer = ?;
  TFarProc = Pointer;
  TFNProgressRoutine = TFarProc;
  PBool = BOOL;
  
    _ULARGE_INTEGER = record
        LowPart: DWORD;
        HighPart: DWORD;
    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;

function CopyCallBack(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: _ULARGE_INTEGER;
dwStreamNumber, dwCallbackReason: DWORD; hSourceFile: THandle; hDestinationFile: THandle; ProgressBar : TNewProgressBar): DWORD;
var
  newpos: Integer;
begin
  Result := PROGRESS_CONTINUE;
  if dwCallbackReason = CALLBACK_CHUNK_FINISHED then
  begin
    newpos := Round(Size64(TotalBytesTransferred) / Size64(TotalFileSize) * 100);
    with Progressbar do
      if newpos <> Position then
        Position := newpos;
    Application.ProcessMessages;
  end;
end;

function CopyFileEx(lpExistingFileName, lpNewFileName: String; lpProgressRoutine: TFNProgressRoutine; lpData: Pointer; pbCancel: PBool; dwCopyFlags: DWORD): BOOL; external 'CopyFileEx{#A}@kernel32.dll stdcall';

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



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

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


Аватара для habib2302

Ветеран


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

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


как сделать растяжение wizard small image на деинсталляторе с сокрытием лейбелов и как сделать,чтобы кликабельное лого отображалось в деинсталляторе
вот скрипт на отображение лого в инсталляторе

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


[Files]
Source: logo.bmp; Flags: dontcopy

[code]
procedure InitializeWizard;
//Лого
var BtnImage: TBitmapImage;
begin
RedesignWizardForm;
ExtractTemporaryFile('logo.bmp');
BtnImage:= TBitmapImage.Create(WizardForm);
BtnImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\logo.bmp'));
BtnImage.SetBounds(20, 315, 154, 42); {первые 2 параметра - координаты левогого верхнего угла по горизонтали и вертикали, дальше ширина и высота, до которой растянуть}
BtnImage.Parent:= WizardForm;
BtnImage.Stretch:= True;

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


Отправлено: 12:23, 25-11-2012 | #1322


Аватара для Mailchik

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


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

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


Цитата habib2302 :
как сделать растяжение wizard small image на деинсталляторе с сокрытием лейбелов
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
procedure InitializeUninstallProgressForm();
 begin
  with UninstallProgressForm do
  begin
   WizardSmallBitmapImage.SetBounds(MainPanel.Left, MainPanel.Top, ClientWidth, MainPanel.Height);
   PageNameLabel.Hide;
   PageDescriptionLabel.Hide;
  end;
end;
Цитата habib2302 :
как сделать,чтобы кликабельное лого отображалось в деинсталляторе
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
BitmapResource=logo:logo.bmp

[Code]
procedure InitializeUninstallProgressForm();
 begin
  with TBitmapImage.Create(nil) do begin
    Parent := UninstallProgressForm;
    Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
    Stretch:= true;
    SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
  end;
end;

Johny777, Pointer в Inno не получится использовать, насколько я знаю.

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

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

Отправлено: 12:39, 25-11-2012 | #1323


Аватара для habib2302

Ветеран


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

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


Цитата Mailchik:
растяжение wizard small image на деинсталляторе с сокрытием лейбелов »
вместо wizard small image на деинсталляторе отображается иконка деинсталлятора

Цитата Mailchik:
кликабельное лого отображалось в деинсталляторе »
выдает ошибку

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


Последний раз редактировалось habib2302, 25-11-2012 в 13:27.


Отправлено: 13:20, 25-11-2012 | #1324


Аватара для Mailchik

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


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

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


Цитата habib2302:
вместо wizard small image на деинсталляторе отображается иконка деинсталлятора
Так я же не знаю какой файл у вас в bitmap. Я лишь пример дал, как сделать то, что вы просите.
Цитата habib2302:
выдает ошибку
Нужна расширенная версия от restools. Попробуйте InnoUltra

Отправлено: 13:59, 25-11-2012 | #1325


Аватара для habib2302

Ветеран


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

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


Цитата Mailchik:
Так я же не знаю какой файл у вас в bitmap. Я лишь пример дал, как сделать то, что вы просите. »
у меня формат .bmp
Цитата Mailchik:
Нужна расширенная версия от restools. Попробуйте Inno Ultra »
у меня как раз и стоит inno setup ultra full ver. Обновлено 2 Октября 2012г

Цитата habib2302:
кликабельное лого отображалось в деинсталляторе »
скрипт на лого заработало!!!

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


Последний раз редактировалось habib2302, 25-11-2012 в 19:54.


Отправлено: 15:03, 25-11-2012 | #1326


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

Ветеран


Contributor


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

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


Цитата Johny777:
Скажите пожалуйста чем можно заменить указатель в той или иной функции. »
Пример: функция CreateFile параметр lpSecurityAttributes (описание: A pointer to a SECURITY_ATTRIBUTES structure...)
Чем заменить:
  1. Целочисленной переменной типа Integer, Longint, Cardinal, DWORD - CreateFile(..., lpSecurityAttributes: Longint, ...): BOOL;
  2. Переменной типа, на которую указывает указатель - CreateFile(..., lpSecurityAttributes: SECURITY_ATTRIBUTES, ...): BOOL; Имеет смысл, если нужно заполнять самому структуру нужными данными. В функцию передается не указатель, а переменная lpSecurityAttributes, точнее ссылка на объект структурного типа SECURITY_ATTRIBUTES. Т.к. ссылки основаны на указателях, передача ссылки вместо указателя не ошибка.
P.S. Иногда при описании параметра какой-либо функции встречается запись "A pointer to a buffer...". В таком случае нужно использовать символьный (реже - байтовый) массив определенного размера (может указываться при описании параметров функции или вычисляться непосредственно при отработке функции).

Johny777, без остановок, пауз, с отменой операции, тупо копирование:
читать дальше »

Код: Выделить весь код
[code]
#define A = (Defined UNICODE) ? "W" : "A"

const
    PROGRESS_CONTINUE = 0;
    PROGRESS_CANCEL = 1;
    CALLBACK_CHUNK_FINISHED = $0;
    
var
    ProgressPage: TOutputProgressWizardPage;
    CancelButton: TButton;
    bCancel: BOOL;

function CopyFileEx(lpExistingFileName, lpNewFileName: String; lpProgressRoutine, lpData: Longint; var pbCancel: BOOL; dwCopyFlags: DWORD): BOOL; external 'CopyFileEx{#A}@kernel32.dll stdcall';
function PathIsDirectory(pszPath: String): BOOL; external 'PathIsDirectory{#A}@shlwapi.dll stdcall';

/////////////////////////////////////////////////////////////
function Size64(LowPart: Longint; HighPart: DWORD): Extended;
begin
    Result := (HighPart + integer(LowPart < 0))*4.294967296E9 + LowPart;
end;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CopyProgressRoutine(TotalFileSizeLo, TotalFileSizeHi, TotalBytesTransferredLo, TotalBytesTransferredHi, StreamSizeLo, StreamSizeHi, StreamBytesTransferredLo, StreamBytesTransferredHi: Longint; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Longint): DWORD;
begin
    if bCancel then Result := PROGRESS_CANCEL else Result := PROGRESS_CONTINUE;
    case dwCallbackReason of
        CALLBACK_CHUNK_FINISHED: begin
            ProgressPage.SetText(Format('%s: %s', ['Файл', CastIntegerToString(lpData)]), Format('%s: %d %%', ['Прогресс', Round(100*Size64(TotalBytesTransferredLo, TotalBytesTransferredHi)/Size64(TotalFileSizeLo, TotalFileSizeHi))]));
            ProgressPage.SetProgress(Round(100*Size64(TotalBytesTransferredLo, TotalBytesTransferredHi)/Size64(TotalFileSizeLo, TotalFileSizeHi)), 100);
        end;
    end;
end;

///////////////////////////////////////////////
procedure CancelButtonOnClick(Sender: TObject);
begin
    bCancel := True;
end;

/////////////////////////////////
procedure CreateCopyProgressPage;
begin
    ProgressPage := CreateOutputProgressPage('Копирование файлов', '');
    CancelButton := TButton.Create(ProgressPage);
    with CancelButton do
    begin
        Parent := ProgressPage.Surface;
        SetBounds(ProgressPage.ProgressBar.Width - WizardForm.CancelButton.Width, ProgressPage.ProgressBar.Top + ProgressPage.ProgressBar.Height + ScaleY(10), WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
        Caption := SetupMessage(msgButtonCancel);
        OnClick := @CancelButtonOnClick;
    end;
end;

///////////////////////////////////////////////////////////////////////////////////////////////////////
function FindFiles(const pFrom, pTo: String; const Recurse: Boolean; const szRootDir: String): Integer;
var
    FR: TFindRec;
    szFileName: String;
begin
    if FindFirst(pFrom, FR) then
    try
        repeat
            if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
            begin
                if not DirExists(Format('%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom))])) then ForceDirectories(Format('%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom))]));
                szFileName := MinimizePathName(Format('%s\%s', [ExtractFileDir(pFrom), FR.Name]), WizardForm.Font, WizardForm.OuterNotebook.ClientWidth - ScaleX(50));
                CopyFileEx(Format('%s\%s', [ExtractFileDir(pFrom), FR.Name]), Format('%s\%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom)), FR.Name]), CallbackAddr('CopyProgressRoutine'), CastStringToInteger(szFileName), bCancel, 0);
                Result := DLLGetLastError;
                if bCancel then Exit;
            end;
        until not FindNext(FR);
    finally
        FindClose(FR);
    end;
    //
    if not Recurse then Exit;
    if FindFirst(Format('%s\*', [ExtractFileDir(pFrom)]), FR) then
    try
        repeat
            if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and (FR.Name <> '.') and (FR.Name <> '..') then
                FindFiles(Format('%s\%s\%s', [ExtractFileDir(pFrom), FR.Name, ExtractFileName(pFrom)]), pTo, Recurse, szRootDir);
        until not FindNext(FR);
    finally
        FindClose(FR);
    end;
end;

//////////////////////////////////////////////////////////////////////////
function xcopy(const pFrom, pTo: String; const Recurse: Boolean): Integer;
// pFrom - source path. wildcard allowed
// pTo - destination path
// Recurse - recursion flag
begin
    if PathIsDirectory(pFrom) then
    begin
        if not DirExists(pFrom) then Exit;
        pFrom := Format('%s\*', [pFrom]);
    end else if not DirExists(ExtractFileDir(pFrom)) then Exit;
    Result := FindFiles(pFrom, pTo, Recurse, ExtractFilePath(pFrom));
end;


/////////////////////////////
procedure InitializeWizard();
begin
    CreateCopyProgressPage;
end;


//////////////////////////////////////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
    if CurPageID = wpWelcome then
    begin
        ProgressPage.Show;
        xcopy('c:\Temp', 'd:\test', True);
        //xcopy('c:\temp\te st\*.dll', 'd:\test', True);
        //xcopy('c:\Temp\ffc\FileFormatConverters.7z', 'c:\Temp\FileFormatConverters.7z', False);
        //xcopy('c:\temp\t est\123', 'c:\temp\t est\1234', True);
        ProgressPage.Hide;
        Result := True;
    end;
    Result := True;
end;

Последний раз редактировалось El Sanchez, 14-03-2013 в 16:47. Причина: update

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

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


Аватара для Johny777

Ветеран


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

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


El Sanchez, спасибо, кажись догоняю:
Если значение/значения из переменной, на которую указывает указатель не нужно можно заменять в функциях/процедурах указатели на целочисленные Integer, Longint, Cardinal, DWORD... чтоб компилятор не ругался на неизвестный тип. Это делается когда из переменной или из переменной ссылающейся на структурный тип, на которую указывает указатель брать ничего не нужно

Если значение/значения нужно, то:
- если указатель на какую-то простую переменную (например type PInteger = ^Integer - указатель на целое число), то в заголовке функции можно заменить PInteger на Integer. Например:
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: PDWORD(меняем на DWORD); var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
- если указатель на переменную структуры (var MyVariable :SECURITY_ATTRIBUTES), то нужно описать SECURITY_ATTRIBUTES в разделе type и присвоить этот тип соответствующим переменным (в заголовке ф-ции и в разделе var)
короче суть в том что указатель можно заменить на переменную,
если указатель на буфер то методом проб и ошибок подставляем array [0..число] of Char или array [0..число] of Byte

Цитата El Sanchez:
без остановок, пауз, тупо копирование »
Спасибо!

Отправлено: 03:03, 26-11-2012 | #1328


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

Ветеран


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

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


как в начале установщика получать права "от администратора"?
и запускать из установщика экзешники с такими же правами

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


Отправлено: 09:35, 26-11-2012 | #1329


Аватара для Johny777

Ветеран


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

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


R.i.m.s.k.y., по умолчанию ты инсталл без прав админа не запустишь, а чтобы отключить нужно настраивать директиву секции [Setup] PrivilegesRequired=не админ
если запускаешь не как админ, то получаешь вот такое окно от винды

Цитата R.i.m.s.k.y.:
запускать из установщика экзешники с такими же правами »
через встроенную функцию
function ExecAsOriginalUser(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
хотя уверен достаточно и обычных
function Exec(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
function ShellExec(const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean;
или секции [RUN]
ведь если инсталл запущен и работает, то мы уже зашли под админом и по дефолту запускается все с его правами

Отправлено: 14:42, 26-11-2012 | #1330



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




 
Переход