Имя пользователя:
Пароль:
 | Правила  

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

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

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

Ветеран


Contributor


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


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

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

 

Забанен


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

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


Johny777, Точно, сразу не сообразил так сделать, удалил taskkill.exe. Проверил, действительно без taskkill.exe всё работает и убивает процессы без исполняемого файла, а значит библиотека не обращается к taskkill.exe и не передаёт какие либо команды для завершения процесса, что имеет большой плюс. Нет двойного обращения.
El Sanchez, Спасибо! Этот ответ вполне устраивает. Т.е на сколько я понял istask.dll обращается напрямую к kernel32.dll ExitProcess.

Если библиотека используется примерно так "istask.dll - > kernel32.dll, а не так istask.dll - > kernel32.dll - > taskkill.exe, то это уже совсем другое дело.
Ещё раз Спасибо!

А что насчёт http://forum.oszone.net/post-1946494-388.html этого вопроса, есть какие нибудь варианты?
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:29, 05-07-2012 | #381



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

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


Аватара для Johny777

Ветеран


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

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


Ваня
код:
читать дальше »
Код: Выделить весь код
#define MyAppName "test"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
UninstallFilesDir={app}\uninstall
BitmapResource=unins:BloodRain_U.bmp



[Files]
Source: tiger.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}



[code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';


function InitializeSetup:boolean;
begin
    ExtractTemporaryFile('tiger.cjstyles');
    LoadSkin(ExpandConstant('{tmp}\tiger.cjstyles'), '');
    
    Result := True;
end;


procedure InitializeUninstallProgressForm();
begin
  with UninstallProgressForm do
  begin
    Width := ScaleX(755);
    Height := ScaleY(500);
    Position := poScreenCenter;
    CancelButton.SetBounds(ScaleX(650), ScaleY(420), ScaleX(75), ScaleY(25));
    
    with ProgressBar do
    begin
      Parent := UninstallProgressForm
      SetBounds(ScaleX(10), ScaleY(370), ScaleX(727), ScaleY(25));
    end;
      
    //unins background bitmap image
    with TBitmapImage.Create(nil) do
    begin
        Parent := UninstallProgressForm;
        Bitmap.LoadFromResourceName(HInstance, '_IS_UNINS');
        SetBounds(ScaleX(0), ScaleY(0), ScaleX(750), ScaleY(352));
    end;

    OuterNotebook.Hide;
    MainPanel.Hide;
    Bevel1.Hide;
    StatusLabel.Hide;
    BeveledLabel.Hide;
    Bevel.Hide;
  end;
end;

function InitializeUninstall(): Boolean;
begin
    if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\tiger.cjstyles'), ExpandConstant('{tmp}\tiger.cjstyles'), True) and
       FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True)
    then
      LoadSkinU(ExpandConstant('{tmp}\tiger.cjstyles'), '');
        
    Result := True;
end;

procedure DeinitializeUninstall();
begin
    if FileExists(ExpandConstant('{tmp}\tiger.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;

procedure DeinitializeSetup;
begin
    UnloadSkin();
end;

скрин:

архив со всем необходимым:
http://rghost.ru/private/39052497/4e...6d5eb1311ede98

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

FMA,
тебе не хватет флага
припиши ... ; Flags: foldershortcut

у тебя стоит {commondesktop}
ты уверен, что на общем рабочем столе ?
{userdesktop} - текущего пользователя

а также вот тебе русская справка http://sendfile.su/570136

Последний раз редактировалось Johny777, 05-07-2012 в 17:56.

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

Отправлено: 17:31, 05-07-2012 | #382


Аватара для Ivan_009

Ветеран


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

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


Source: BmpFiles\fon.bmp; DestDir: {app}; Attribs: hidden system;
Source: BmpFiles\fonAC.bmp; DestDir: {app}; Attribs: hidden system;

Johny777, а как загрузить 2 картинки на InitializeUninstallProgressForm(); пробую так неполучается

Последний раз редактировалось Ivan_009, 11-08-2012 в 07:16.


Отправлено: 19:30, 05-07-2012 | #383


Аватара для Ivan_009

Ветеран


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

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


Как сделать двойной прогресс бар тоесть вот такой через IsDone

Последний раз редактировалось Ivan_009, 11-08-2012 в 07:16.


Отправлено: 21:58, 05-07-2012 | #384


Аватара для Johny777

Ветеран


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

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


Ваня,
как добавить ещё одну картинку в BitmapResource=unins:BloodRain_U.bmp не знаю
( Кстати! Оказывается очень удобно использовать для некоторых картинок секцию Setup ,
тк нет лишней писанины с добавлением картинок в секцию Files и их перемещением в темп. как чуть ниже )

поэтому так (приписал немного комментариев)
читать дальше »
Код: Выделить весь код
#define MyAppName "test"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
UninstallFilesDir={app}\uninstall
;BitmapResource=unins:BloodRain_U.bmp|unins:BloodRain_U2.bmp



[Files]
Source: tiger.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: Pic1.bmp; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: Pic2.bmp; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;



[code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';


function InitializeSetup:boolean;
begin
    ExtractTemporaryFile('tiger.cjstyles');
    LoadSkin(ExpandConstant('{tmp}\tiger.cjstyles'), '');
    
    Result := True;
end;


procedure InitializeUninstallProgressForm();
begin
  with UninstallProgressForm do
  begin
    Width := ScaleX(757); /// ширина формы
    Height := ScaleY(500); /// высота формы
    Position := poScreenCenter; /// расположение формы в центре экрана
    CancelButton.SetBounds(ScaleX(650), ScaleY(420), ScaleX(75), ScaleY(25)); /// расположение кнопки отмены
    
    with ProgressBar do  /// прогресбар
    begin
      Parent := UninstallProgressForm
      SetBounds(ScaleX(10), ScaleY(370), ScaleX(727), ScaleY(25));
    end;

    /// если копирование этого и того файла в темп True, то
    if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\Pic1.bmp'), ExpandConstant('{tmp}\Pic1.bmp'), True) and
       FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\Pic2.bmp'), ExpandConstant('{tmp}\Pic2.bmp'), True)
    then
    begin  /// создаём 2 безымянныйе картинки
      //unins background bitmap image
      with TBitmapImage.Create(nil) do
      begin
        Parent := UninstallProgressForm;
        Bitmap.LoadFromFile(ExpandConstant('{tmp}\Pic1.bmp')); /// грузим одну критнку
        SetBounds(ScaleX(0), ScaleY(0), ScaleX(750), ScaleY(352));
      end;

      with TBitmapImage.Create(nil) do
      begin
        Parent := UninstallProgressForm;
        Bitmap.LoadFromFile(ExpandConstant('{tmp}\Pic2.bmp')); /// грузим другую картинку
        SetBounds(ScaleX(0), ScaleY(352), ScaleX(750), ScaleY(352));
      end;
    end;
    OuterNotebook.Hide;   /// скрываем всё, что не нужно /// а все элементы UninstallProgressForm есть во вкладке компилятора расширенной версии "поддержка Inno Setup" на строке 2300
    MainPanel.Hide;
    Bevel1.Hide;
    StatusLabel.Hide;
    BeveledLabel.Hide;
    Bevel.Hide;
  end;
end;

function InitializeUninstall(): Boolean;
begin
    if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\tiger.cjstyles'), ExpandConstant('{tmp}\tiger.cjstyles'), True) and
       FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True)
    then
      LoadSkinU(ExpandConstant('{tmp}\tiger.cjstyles'), '');
        
    Result := True;
end;

procedure DeinitializeUninstall();
begin
    if FileExists(ExpandConstant('{tmp}\tiger.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;

procedure DeinitializeSetup;
begin
    UnloadSkin();
end;


и, Вань, зачем тебе 2 картинки?
склей в фотошопе в одну
(Создать - новый фон (настранваешь цвет фона и указываешь размер) - перетаскиваешь обе картинки на этот самый фон - растягиваешь и двигаешь до получения желаемого результата -
нажимаешь инструмент "Перемещение(V)" и при необходимости инструментом "Рамка (С)" кадрируешь (вырезаешь нужный участок)- сохраняешь в 32-битном(!).bmp - файле)
юзаю версию 5.1 (русскую)
Цитата Ivan_009:
Как сделать двойной прогресс бар тоесть вот такой через IsDone »
хз
исдан не знаю


------------------------------------------------------------------------------------Update
понял как добавлять картинки через Setup
пример в ...\Inno Setup 5\Examples\Example_BitmapResource.iss прояснил ситуацию!
сократил код
улучшенный результат:
читать дальше »
Код: Выделить весь код
#define MyAppName "test"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
UninstallFilesDir={app}\uninstall
BitmapResource=unins:Pic1.bmp|unins2:Pic2.bmp



[Files]
Source: tiger.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;

[code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';


function InitializeSetup:boolean;
begin
    ExtractTemporaryFile('tiger.cjstyles');
    LoadSkin(ExpandConstant('{tmp}\tiger.cjstyles'), '');

    Result := True;
end;


procedure InitializeUninstallProgressForm();
begin
  with UninstallProgressForm do
  begin
    Width := ScaleX(757); /// ширина формы
    Height := ScaleY(500); /// высота формы
    Position := poScreenCenter; /// расположение формы в центре экрана
    CancelButton.SetBounds(ScaleX(650), ScaleY(420), ScaleX(75), ScaleY(25)); /// расположение кнопки отмены

    with ProgressBar do  /// прогресбар
    begin
      Parent := UninstallProgressForm
      SetBounds(ScaleX(10), ScaleY(370), ScaleX(727), ScaleY(25));
    end;
    
    /// создаём 2 безымянныйе картинки
    with TBitmapImage.Create(nil) do
    begin
      Parent := UninstallProgressForm;
      Bitmap.LoadFromResourceName(HInstance, '_IS_UNINS'); /// грузим одну критнку
      SetBounds(ScaleX(0), ScaleY(0), ScaleX(750), ScaleY(352));
    end;
    
    with TBitmapImage.Create(nil) do
    begin
      Parent := UninstallProgressForm;
      Bitmap.LoadFromResourceName(HInstance, '_IS_UNINS2'); /// грузим другую картинку
      SetBounds(ScaleX(0), ScaleY(352), ScaleX(750), ScaleY(352));
    end;
    
    OuterNotebook.Hide;   /// скрываем всё, что не нужно /// а все элементы UninstallProgressForm есть во вкладке компилятора расширенной версии "поддержка Inno Setup" на строке 2300
    MainPanel.Hide;
    Bevel1.Hide;
    StatusLabel.Hide;
    BeveledLabel.Hide;
    Bevel.Hide;
  end;
end;

function InitializeUninstall(): Boolean;
begin
    if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\tiger.cjstyles'), ExpandConstant('{tmp}\tiger.cjstyles'), True) and
       FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True)
    then
      LoadSkinU(ExpandConstant('{tmp}\tiger.cjstyles'), '');

    Result := True;
end;

procedure DeinitializeUninstall();
begin
    if FileExists(ExpandConstant('{tmp}\tiger.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;

procedure DeinitializeSetup;
begin
    UnloadSkin();
end;

изменённые строки выделил жирным (3 строки)

Последний раз редактировалось Johny777, 06-07-2012 в 13:08.

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

Отправлено: 22:48, 05-07-2012 | #385


Аватара для Johny777

Ветеран


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

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


1. Переделал "проценты установки" под CallbackAddr

теперь библиотека "InnoCallback.dll" не нужна (нужна только расширенная версия Inno)

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

[Files]
Source: compiler:innocallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs

[code]
type
  TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
  

var
  PercentsTimer: LongWord;
  PercentsLabel: TLabel;
  

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';


function NumToStr(Float: Extended): String;
begin
  Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
  while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
end;


procedure PercentsProc(h, msg, idevent, dwTime: Longword);
begin
  with WizardForm.ProgressGauge do
  begin
    PercentsLabel.Caption := NumToStr((Position*100)/Max) + ' %';
    Application.Title := ' ' + NumToStr((Position*100)/Max) + ' %';
  end;
end;


procedure DeinitializeSetup();
begin
  KillTimer(0, PercentsTimer);
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
  
    PercentsLabel:= TLabel.Create(nil);
    with PercentsLabel do
    begin
      SetBounds(WizardForm.ProgressGauge.Left + ScaleX(30), WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10), WizardForm.StatusLabel.Width, WizardForm.StatusLabel.Height);
      AutoSize:= True;
      Transparent := True;
      Parent:= WizardForm.InstallingPage;
    end;

    PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
    
  end;
  
  if CurStep = ssPostInstall then
  begin
    KillTimer(0, PercentsTimer);
    Application.Title := ' Готово';
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID=wpInstalling then
  begin
    Confirm := False;
    case ExitSetupMsgBox of
      True :
      begin
        PercentsLabel.Free;
        Application.Title := ExpandConstant(' ' + SetupMessage(msgButtonCancel) + '...');
        Cancel := True;
      end;
      False : Cancel := False;
    end;
  end;
end;


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

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

[code]
var
  PercentsTimer: LongWord;
  PercentsLabel: TLabel;
  
  
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
  

function NumToStr(Float: Extended): String;
begin
  Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
  while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
end;


procedure PercentsProc;
begin
  with WizardForm.ProgressGauge do
  begin
    PercentsLabel.Caption := NumToStr((Position*100)/Max) + ' %';
    Application.Title := ' ' + NumToStr((Position*100)/Max) + ' %';  /// проценты на кнопке в панели задач
  end;
end;


procedure DeinitializeSetup();
begin
  KillTimer(WizardForm.Handle, PercentsTimer);
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
  
    PercentsLabel:= TLabel.Create(nil);
    with PercentsLabel do
    begin
      SetBounds(WizardForm.ProgressGauge.Left + ScaleX(30), WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10), WizardForm.StatusLabel.Width, WizardForm.StatusLabel.Height);
      AutoSize:= True;
      Transparent := True;
      Parent:= WizardForm.InstallingPage;
    end;
    
    PercentsTimer:= SetTimer(WizardForm.Handle, 0, 100, CallbackAddr('PercentsProc'));
    
  end;
  
  if CurStep = ssPostInstall then
  begin
    KillTimer(WizardForm.Handle, PercentsTimer);
    Application.Title := ' Готово';
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID=wpInstalling then
  begin
    Confirm := False;
    case ExitSetupMsgBox of
      True :
      begin
        PercentsLabel.Free;
        Application.Title := ExpandConstant(' ' + SetupMessage(msgButtonCancel) + '...');
        Cancel := True;
      end;
      False : Cancel := False;
    end;
  end;
end;


Примечание:
кто не хочет отображения десятой доли процента после запятой удалите функцию
function NumToStr(Float: Extended): String;
begin
...
end;
и замените в процедуре
procedure PercentsProc;

NumToStr на IntToStr
===========================================================================================
2. может кто пожалуйста избавить это код от InnoCallBack.dll (при перетаскивании основного окно перетаскивается форма)
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

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

[code]
const
  WM_MOVE = $3;

  GWL_WNDPROC = -4;

type
  TCallbackProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint  ;

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function WndProcCallBack(P:TCallbackProc;ParamCount:integer  ):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';

var
Form1: TForm;
OldProc: Longint;

function MyProc(h: HWND; Msg, wParam, lParam: longint): Longint;
begin
  if Msg=WM_MOVE then SetWindowPos(Form1.Handle, 0, WizardForm.Left+WizardForm.Width+5, WizardForm.Top, 0, 0, $415);
  Result:= CallWindowProc(OldProc, h, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
  Form1:= TForm.Create(MainForm);
  Form1.SetBounds(WizardForm.Left+WizardForm.Width+5  , WizardForm.Top, 100, 358);
  Form1.BorderStyle:= bsSingle;
  Form1.Show;

  OldProc:= SetWindowLong(WizardForm.Handle, GWL_WNDPROC, WndProcCallBack(@MyProc, 4));
end;

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

речь идёт о функции:
function WndProcCallBack(P:TCallbackProc;ParamCount:integer ):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
=================================================================================
3. и последнее:
Скажите пожалуйста (если можно попроще) когда нужно (лучше?) использовать указатель nil в Inno и на что он влияет?
(из интереса присвоил всем элементам (ричэдитам, панелям, чекбосам) этот указатель и теперь инсталл кушает на 400 кб оперативки меньше )

Последний раз редактировалось Johny777, 07-07-2012 в 13:50.

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

Отправлено: 15:27, 06-07-2012 | #386


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

Ветеран


Contributor


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

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


Цитата Johny777:
2. может кто пожалуйста избавить это код от InnoCallBack.dll (при перетаскивании основного окно перетаскивается форма) »
Johny777, замени WndProcCallBack(@MyProc, 4) на CallbackAddr('MyProc'), ну и удали ненужные объявленные тип TCallbackProc и функцию WndProcCallBack.

Цитата Johny777:
Скажите пожалуйста (если можно попроще) когда нужно (лучше?) использовать указатель nil в Inno и на что он влияет?
(из интереса присвоил всем элементам (ричэдитам, панелям, чекбосам) этот указатель и теперь инсталл кушает на 400 кб оперативки меньше »
Типа так? - Form1 := TForm.Create(nil); Параметром конструктора Create указывается компонент-владелец создаваемого компонента, т.е. если мы создаем форму вот так - Form1 := TForm.Create(WizardForm), то владелец WizardForm отвечает за выделение/освобождение памяти для Form1 и при разрушении WizardForm автоматически разрушается и Form1. nil же означает, что у создаваемого компонента нет владельца, создается такой компонент значительно быстрее, но ответственность за освобождение памяти в случае, когда компонент уже не нужен, лежит на программисте (вызвать метод Free). Как-то так.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:36, 07-07-2012 | #387


Аватара для Ivan_009

Ветеран


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

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


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

Последний раз редактировалось Ivan_009, 11-08-2012 в 07:16.


Отправлено: 21:07, 07-07-2012 | #388


Аватара для Johny777

Ветеран


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

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


Цитата Ivan_009:
Как в данном модуле удалить все ненужное и оставить только те функции которые нужны данной кнопке »
прочистил как мог (ботву тоже)
всё в одном коде
архив
http://rghost.ru/private/39092559/fc...d1fb7dd0472c5b

код:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=BassExample
AppVerName=BassExample
DefaultDirName={pf}\BassExample
Compression=none



[Files]
Source: BASS_Files\*;  DestDir: {tmp}; Flags: dontcopy
Source: music.mp3;  DestDir: {tmp}; Flags: dontcopy



[code]
/// кусок ботвы /// начало
type
  TBtnEventProc = procedure(h:HWND);
  
  

procedure gdipShutdown; external 'gdipShutdown@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetCursor(h:HWND; hCur:Cardinal); external 'BtnSetCursor@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetEvent(h :HWND; EventID :integer; Event :Longword); external 'BtnSetEvent@{tmp}\botva2.dll stdcall delayload';
function BtnCreate(hParent :HWND; Left, Top, Width, Height :integer; FileName :PAnsiChar; ShadowWidth :integer; IsCheckBtn :boolean) :HWND; external 'BtnCreate@{tmp}\botva2.dll stdcall delayload';
function GetSysCursorHandle(id:integer):Cardinal; external 'GetSysCursorHandle@{tmp}\botva2.dll stdcall delayload';
function WrapBtnCallback(Callback: TBtnEventProc; ParamCount: Integer): Longword; external 'wrapcallbackaddr@{tmp}\CallbackCtrl.dll stdcall delayload';
/// конец



type
  HSTREAM = DWORD;
  TBASSTmrProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
  
  
  
const
  BASS_ACTIVE_STOPPED = 0;
  BASS_ACTIVE_PAUSED  = 3;
  
  

var
  BASS_Volume: DWORD; BASS_Mp3Handle: HSTREAM;
  BASS_OnOffBtn: HWND;
  Songs: TStringList; SongTimer: Longword;
  CurSong: Integer;
  


function _BASS_WrapTimerProc(callback: TBASSTmrProc; paramcount: integer):longword; external 'wrapcallbackaddr@{tmp}\callbackctrl.dll stdcall delayload';
function _BASS_SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall delayload';
function _BASS_KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall delayload';
function _BASS_Init(device: LongInt; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean; external 'BASS_Init@{tmp}\BASS.dll stdcall delayload';
function _BASS_StreamCreateFile(mem: BOOL; f: PAnsiChar; offset1, offset2, length1, length2: DWORD; flags: DWORD): HSTREAM; external 'BASS_StreamCreateFile@{tmp}\BASS.dll stdcall delayload';
function _BASS_StreamFree(handle: HSTREAM): BOOL; external 'BASS_StreamFree@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean; external 'BASS_ChannelPlay@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelIsActive(handle: DWORD): DWORD; external 'BASS_ChannelIsActive@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelPause(handle: DWORD): Boolean; external 'BASS_ChannelPause@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelSetAttribute(handle: DWORD; Flags: DWORD; Value: Single): Boolean; external 'BASS_ChannelSetAttribute@{tmp}\BASS.dll stdcall delayload';
function _BASS_Stop(): Boolean; external 'BASS_Stop@{tmp}\BASS.dll stdcall delayload';
function _BASS_Free(): Boolean; external 'BASS_Free@{tmp}\BASS.dll stdcall delayload';
function _BASS_Start(): Boolean; external 'BASS_Start@{tmp}\BASS.dll stdcall delayload';




procedure BASSTimerProc(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  if (_BASS_ChannelIsActive(BASS_Mp3Handle) = BASS_ACTIVE_STOPPED)and(Songs.Count>1) then begin
    CurSong:= CurSong+1;
    if CurSong>=Songs.Count then CurSong:=0;
    _BASS_StreamFree(BASS_Mp3Handle);
    BASS_Mp3Handle:= _BASS_StreamCreateFile(FALSE, PAnsiChar(Songs.Strings[CurSong]), 0, 0, 0, 0, 0);
    _BASS_ChannelPlay(BASS_Mp3Handle, False);
  end;
end;



procedure BASS_Init(Mp3Name: String);
var
  FSR: TFindRec; Flags: DWORD;
begin
  if not FileExists(ExpandConstant('{tmp}\Bass.dll')) then ExtractTemporaryFile('Bass.dll');
  if not FileExists(ExpandConstant('{tmp}\callbackctrl.dll')) then ExtractTemporaryFile('callbackctrl.dll');
  Songs:= TStringList.Create;
  Songs.Clear;
  Mp3Name:= ExpandConstant(Mp3Name);
  if FindFirst(Mp3name, FSR) then try
    repeat
      if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
        Songs.Add(AddBackslash(ExtractFilePath(Mp3Name))+FSR.Name);
    until not FindNext(FSR);
  finally
    FindClose(FSR);
  end;
  CurSong:= 0;
  _BASS_Init(-1, 44100, 0, 0, 0)
  _BASS_Start();
  if Songs.Count>1 then Flags:= 0 else Flags:= 4;
  BASS_Mp3Handle:= _BASS_StreamCreateFile(FALSE, PAnsiChar(Songs.Strings[CurSong]), 0, 0, 0, 0, Flags);
  _BASS_ChannelPlay(BASS_Mp3Handle, False);
  if Songs.Count>1 then
    SongTimer:= _BASS_SetTimer(0, 0, 100, _BASS_WrapTimerProc(@BASSTimerProc, 4));
  BASS_Volume:= 100;
  _BASS_ChannelSetAttribute(BASS_Mp3Handle, 2, BASS_Volume/100.0);
end;



procedure BASS_DeInit();
begin
  _BASS_Stop;
  _BASS_Free;
  if Songs.Count>1 then
    _BASS_KillTimer(0, SongTimer);
  Songs.Free;
end;



procedure BASS_OnOffClick(Handle: HWND);
begin
  if (_BASS_ChannelIsActive(BASS_Mp3Handle) = BASS_ACTIVE_PAUSED) then _BASS_ChannelPlay(BASS_Mp3Handle, False) else
  _BASS_ChannelPause(BASS_Mp3Handle)
end;



procedure BASS_CreateOnOffButton(Parent: TWinControl; Image: String; Left, Top, Width, Height, ShadowWidth: Integer);
begin
  BASS_OnOffBtn:= BtnCreate(Parent.Handle, ScaleX(Left), ScaleY(Top), ScaleX(Width), ScaleY(Height), ExpandConstant(Image), ShadowWidth, True)
  BtnSetCursor(BASS_OnOffBtn,GetSysCursorHandle(32649));
  BtnSetEvent(BASS_OnOffBtn, 1, WrapBtnCallback(@BASS_OnOffClick, 1))
end;



procedure InitializeWizard();
begin
  ExtractTemporaryFile('BASS.dll');
  ExtractTemporaryFile('CallbackCtrl.dll');
  ExtractTemporaryFile('botva2.dll');
  ExtractTemporaryFile('MusicButton.png');
  ExtractTemporaryFile('Music.mp3');

  BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
  //Можно добавить в инсталл несколько песен
  //BASS_Init(ExpandConstant('{tmp}\*'))        //Поиск по маске
  BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Создаем кнопку вкл/выкл
end;



procedure DeinitializeSetup();
begin
  BASS_DeInit; //Освобождаем процесс
  gdipShutdown
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:15, 07-07-2012 | #389


Аватара для mariolast

Ветеран


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

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


Может кто еще пользуется botva2.dll
Хочу разрисовать прогрессбар при джеинсталляции
Но что то не так видимо делаю.
Затык на функции CallWindowProc(PBOldProcUn,h,Msg,wParam,lParam);
Вызывает ошибку вызова процедуры
Вот кусок кода, может подскажете, в чем ошибка.
Код: Выделить весь код
function CallBackProc(P:TPBProc;ParamCount:integer):LongWord; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall'; 
 function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall'; 
 function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall'; 
 function GetTickCountUn: DWORD; external 'GetTickCount@kernel32.dll stdcall uninstallonly'; 
 ... 
 ... 
 function PBProcUn(h:hWnd;Msg,wParam,lParam:Longint):Longint; 
 var 
   lt:Longint; 
   dt,at,pr,i1,i2:Extended; 
   p:string; 
   tc:DWORD; 
 begin 
 Result:=7; 
   Result:=CallWindowProc(PBOldProcUn,h,Msg,wParam,lParam); 
   if (Msg=$402) and (UninstallProgressForm.Progressbar.Position>UninstallProgressForm.Progressbar.Min) then begin 
     i1:=UninstallProgressForm.Progressbar.Position-UninstallProgressForm.Progressbar.Min; 
     i2:=UninstallProgressForm.Progressbar.Max-UninstallProgressForm.Progressbar.Min; 
  
     tc:=GetTickCountUn; 
     if (tc-eTimeUn)>=1000 then begin 
       dt:=(tc-sTimeUn)/1000; 
       at:=i2*dt/i1; 
       lt:=Round(at-dt) 
       TimeLeftLabel.Caption:='Îñòàëîñü - '+LongintToStringTime(lt); 
       eTimeUn:=tc; 
     end; 
  
     pr:=i1*100/i2; 
     p:=' - ['+Format('%f',[pr])+'%]'; 
     StringChange(p,',','.'); 
     TimeLeftLabelUn.Caption:=WFCaption+p; 
     WizardForm.Caption:=WFCaption+p; 
  
     ImgPBSetPosition(NewPBun,pr); 
     ImgApplyChanges(UninstallProgressForm.Handle); 
   end; 
 end; 
 ... 
 ... 
 procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 
 var 
   Names: TArrayOfSting; 
   I, Errorcode: Integer; 
   S,RegAss: String; 
  
 begin 
   if CurUninstallStep=usUninstall then 
   begin 
 NewPBun:=ImgPBCreate(UninstallProgressForm.InstallingPage.Handle, ExpandConstant('{tmp}\pbbkg.png'), ExpandConstant('{tmp}\pb.png'),UninstallProgressForm.Progressbar.Left,UninstallProgressForm.Progressbar.Top,UninstallProgressForm.Progressbar.Width,25); 
       ImgApplyChanges(UninstallProgressForm.InstallingPage.Handle); 
  
       WFCaption:=UninstallProgressForm.Caption; 
  
       TimeLeftLabelUn:=TLabel.Create(nil); 
       with TimeLeftLabelUn do begin 
         Parent:=UninstallProgressForm.InstallingPage; 
         AutoSize:=False; 
         SetBounds(ScaleX(400),ScaleY(150),ScaleX(400),ScaleY(21)); 
         Transparent:=True; 
         Font.Color:=clWhite; 
         Font.Style:= [fsBold]; 
       end; 
  
       sTimeUn:=GetTickCountUn; 
       eTimeUn:=sTimeUn; 
  
       PBOldProcUn:=SetWindowLong(UninstallProgressForm.InstallingPage.Handle,-4,CallBackProc(@PBProcUn,4)); 
        
   end;

Отправлено: 10:39, 08-07-2012 | #390



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




 
Переход