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

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

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

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

Ветеран


Contributor


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


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

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

 

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


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

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


Ещё одна небольшая проблема:
Нужно включить все вложенные папки, сделал вот так вот..
Код: Выделить весь код
Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\vehicles\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Tankmodels
Но, при установке, инсталлятор распаковывает только подпапки, а саму папку нет.. что делать и как быть?

Отправлено: 18:33, 13-09-2012 | #921



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

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


Аватара для Johny777

Ветеран


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

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


Добрые люди!
вот намутил код
при нажатии на айтем всплывающего контекстного меню его название копируется в соответствующий эдит
но иногда нужно приписать соответствующее число (как с текстом +fps_max <число>)
для этого выполняется функция Param_Num

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

вот код:

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



[  code]
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): LongWord; external 'GetSystemMenu@user32.dll stdcall';
function DeleteMenu(hMenu: LongWord; uPosition, uFlags: UINT): BOOL; external 'DeleteMenu@user32.dll stdcall';
function GetClassLong(Wnd: HWnd; Index: Integer): Longint; external 'GetClassLongA@user32.dll stdcall';
function SetClassLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetClassLongA@user32.dll stdcall';

var
  Param_Edit: TEdit;
  Param_Button, OK_Button: TButton;
  Param_PopMenu: TPopupMenu;
    
    
procedure Num_Edit_OnChange(Sender:TObject);
begin
  OK_Button.Enabled := TEdit(Sender).Text <> '';
end;
    
    
function Param_Num(Param, Info_Text: String): String;
var
  NumForm: TForm;
  Num_Edit: TEdit;
begin
  Result := '';

  NumForm := TForm.Create(nil);
  with NumForm do
  begin
    ClientWidth := ScaleX(200);
    ClientHeight := ScaleY(90);
    Position := poScreenCenter;
    DeleteMenu(GetSystemMenu(NumForm.Handle,False), $F060,0); /// сделать кнопку "закрыть" неактивной
    SetClassLong(NumForm.Handle, -26, GetClassLong(NumForm.Handle, -26) or $200); /// блокировка комбинации alt + f4
    
    with TLabel.Create(nil) do
    begin
      SetBounds(ScaleX(10), ScaleY(5), ScaleX(207), ScaleY(16));
      Caption := Info_Text;
      Parent := NumForm;
      Font.Size := 8;
    end;
    
    Num_Edit := TNewEdit.Create(nil);
    with Num_Edit do
    begin
      Parent := NumForm;
      SetBounds(ScaleX(10), ScaleY(30), ScaleX(145), ScaleY(21));
      Text := '';
      OnChange := @Num_Edit_OnChange;
    end;

    OK_Button := TButton.Create(nil)
    with OK_Button do     // ok
    begin
      SetBounds(NumForm.ClientWidth - ScaleX(80), ScaleY(60), ScaleX(70), ScaleX(23));
      Parent := NumForm;
      Caption := ExpandConstant(SetupMessage(msgButtonOK));
      ModalResult := mrOk;
      Enabled := False;
    end;

    if ShowModal = mrOk then 
    begin
      Delete(Param,Pos('<число>',Param),Length(Param));
      Result := Param + ' ' + Num_Edit.Text;
    end;

    Free;
  end;
end;

procedure Paste(Sender:TObject);
begin
  case TMenuItem(Sender).Caption of
    '-console':           if Param_Edit.Text = '' then Param_Edit.Text := TMenuItem(Sender).Caption else Param_Edit.Text := Param_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '+fps_max <число>':   if Param_Edit.Text = '' then Param_Edit.Text := + Param_Num(TMenuItem(Sender).Caption, 'сколько кадров в секунду?') else Param_Edit.Text := Param_Edit.Text + ' ' + Param_Num(TMenuItem(Sender).Caption, 'сколько кадров в секунду?');
    '-dev':               if Param_Edit.Text = '' then Param_Edit.Text := TMenuItem(Sender).Caption else Param_Edit.Text := Param_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '-gl':                if Param_Edit.Text = '' then Param_Edit.Text := TMenuItem(Sender).Caption else Param_Edit.Text := Param_Edit.Text + ' ' + TMenuItem(Sender).Caption;
  end;
end;

procedure Param_Button_OnClick(Sender:TObject);
var
  pt: TPoint;
begin
  pt := Param_Button.ClientToScreen(pt);
  Param_PopMenu.Popup(pt.x, pt.y);
end;


procedure InitializeWizard();
begin
  WizardForm.OuterNotebook.Hide;

  Param_Edit := TNewEdit.Create(nil);
  with Param_Edit do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(100), ScaleY(100), ScaleX(145), ScaleY(21));
    Text := '';
  end;
  
  Param_Button := TButton.Create(nil);
  with Param_Button do
  begin
    Parent := WizardForm;
    SetBounds(Param_Edit.Left + Param_Edit.Width + ScaleX(5), Param_Edit.Top, ScaleX(15), Param_Edit.Height);
    Caption := '!';
    Cursor := crHand;
    OnClick := @Param_Button_OnClick;
  end;
  
  Param_PopMenu := NewPopupMenu(WizardForm, 'MyPopupMenu', paLeft, True, [
    NewItem('-console', 0, False, True, @Paste, 11, ''),
    NewLine,
    NewItem('+fps_max <число>', 0, False, True, @Paste, 12, ''),
    NewItem('-dev', 0, False, True, @Paste, 13, ''),
    NewItem('-gl', 0, False, True, @Paste, 14, '')
  ]);
end;



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

HElmo,
может так? (подчеркнул правку)
Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\vehicles\*"; DestDir: "{app}\vehicles"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Tankmodels

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

MogilShik2007,
путём создания кастомнго чекбокса
(тк с чеклистбоксами я ещё, образно говоря, не бухал )

читать дальше »
Код: Выделить весь код
#define MyAppExeName "Stronghold.exe"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[  Code]
#include "TextModule.iss"

var
  Run_CheckBox: TNewCheckBox;
  Run_Label: TLabelString;
  
procedure Color_Label_OnClick(Sender:TObject);
begin
  if not Run_CheckBox.Checked then
  begin
    Run_CheckBox.Checked := True;
    Exit;
  end else
  begin
    Run_CheckBox.Checked := False;
    Exit;
  end
end;

procedure InitializeWizard();
var
  w, s, h: Integer;
begin 
  Run_CheckBox := TNewCheckBox.Create(nil);
  with Run_CheckBox do
  begin
    Parent := WizardForm.FinishedPage;
    SetBounds(ScaleX(224),ScaleY(248),ScaleX(17),ScaleY(17))
  end;

  w := ScaleX(100); /// ширина
  s := Run_CheckBox.Top + ScaleY(2); /// сверху
  h := Run_CheckBox.Left + ScaleX(17); /// слева
  
  Run_Label := WriteText('[color=$0000ff]Запустить[/color] [b][u][color=$00ff00]Игру[/color][/u][/b]',h,s,w,WizardForm.FinishedPage);

  with TLabel.Create(nil) do
  begin
    SetBounds(h, s, w, ScaleY(17));
    AutoSize := False;
    OnClick := @Color_Label_OnClick;
    Parent := WizardForm.FinishedPage;
    Transparent := True;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
  if (CurStep = ssDone) and (Run_CheckBox.Checked = True) then Exec(ExpandConstant('{app}\{#MyAppExeName}'), '', ExpandConstant('{app}'), SW_HIDE, ewNoWait, ErrorCode);
end;


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

SatHan,
не думаю что функция рассчитана на протягивание ярлыка от ярлыка (как бы бредово это не звучало)
те в экзешнике может и есть инфа благодаря которой мы имеем правильное назвния а в ярлыке нет

Последний раз редактировалось Johny777, 14-09-2012 в 02:24.

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

Отправлено: 19:42, 13-09-2012 | #922


Аватара для Tco 03

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


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

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


Цитата SatHan:
Если код каким то образом находит имя и приписывает его к ярлыку - это конечно не понятно от куда берёт. А вот как его задать на своё (Например я хочу чтоб hl.exe назывался не Half-Life а Half-Life-Моя Игра). Как это сделать? »
Ты в этом коде итак задал имя ярлыка:
Код: Выделить весь код
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
Напиши вместо: {#MyAppName} что хочешь и будет тебе счастье.
Код: Выделить весь код
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\Half-Life - Моя Игра"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon

Отправлено: 23:04, 13-09-2012 | #923


Аватара для SatHan

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


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

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


Цитата Johny777:
не думаю что функция рассчитана на протягивание ярлыка от ярлыка (как бы бредово это не звучало)
те в экзешнике может и есть инфа благодаря которой мы имеем правильное назвния а в ярлыке нет »
чем и как он её берёт, какой функцией или процедурой и можно ли задать в ней в качестве имени ярлыка препроцессор?

Цитата Tco 03:
Ты в этом коде итак задал имя ярлык »
причём здесь Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon? её я здесь написал для примера. интересует для windows 7. как в качестве имя ярлыка на панели задач указать в коде препроцессор {#MyAppName}?

Цитата Tco 03:
Напиши вместо: {#MyAppName} что хочешь и будет тебе счастье. »
с препроцессором как раз проблем нет - там можно любое название написать. даже "Half-Life - Моя Игра". его удобно использовать во многих случаях а не только для названий.

Последний раз редактировалось SatHan, 14-09-2012 в 02:35.


Отправлено: 02:26, 14-09-2012 | #924


Аватара для Tco 03

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


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

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


Я её тебе тоже для примера написал...
#define NameQuickLaunch "Half-Life - Моя Игра"
...Microsoft\Internet Explorer\Quick Launch\{#NameQuickLaunch}...

Отправлено: 11:37, 14-09-2012 | #925


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

Ветеран


Contributor


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

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


Цитата Aleksoid1978:
Нашел косяк в скрипте Закрепления на панели задач »
Aleksoid1978, в чем именно? Скрипт закрепления ярлыка на панели задач - это порт vbs-сценария, представленного вами (кстати, у вас в примере не используется самое главное - переменная strVerb) и гуляющего в интернете.
Цитата Aleksoid1978:
если в х64 битной системе и файл расположен по пути "C:\Program Files\..." - то значок программы закреплаяется, но если запустить программу - создается еще один значок, уже запущенной задачи на панели задач, если закрепить из пути "C:\Program Files (x86)\..." - то все ок. Разрядность программы при этом не имеет значения. »
Aleksoid1978, это верно. Гугл выдает, что эта проблема у многих программ возникает. Думаю, что система при вызове кода закрепления ярлыка программы из Program Files, system32 (т.е. для директорий, предназначенных для 64-битных файлов) из 32-битной программы, коей является Inno, тихо редиректит 64-битные директории на 32-битные. Да, созданный ярлык ссылается куда надо, но похоже имеет разные AppID с иконкой запущенного того же самого приложения, поэтому система и не может их сгруппировать. Как-то так, я могу и ошибаться, точнее программисты скажут, которые вплотную работают с API таскбара.
Цитата Aleksoid1978:
Все получилось, кроме одного - при наличии на панели уже такого ярлыка - создается ярлык типа MPC-BE(2).lnk; »
Aleksoid1978, кстати да, я не учел наличие ярлыка. Исправление:
читать дальше »

Код: Выделить весь код
const
    LOAD_LIBRARY_AS_DATAFILE = $2;

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

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';

/////////////////////////////////////////////////////////////////////////
function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;
//szFilename: full path to executable file
//IsPin: False - unpin to TaskBar, True - pin from TaskBar
var
    hInst: THandle;
    buf: array [0..255] of Char;
    i, res: Integer;
    strLnk, strVerb: String;
    objShell, colVerbs: Variant;
begin
    Result := False;
    if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit;
    if IsPin then
    begin
        if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
        begin
            while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
            if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
        end;
        res := 5386;
    end else res := 5387;
    hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hInst <> 0 then
    try
        for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
        try
            objShell := CreateOleObject('Shell.Application');
            colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
            for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        except
            Exit;
        end;
    finally
        FreeDLL(hInst);
    end;
end;


Цитата Johny777:
не знаю как не допускать ввод в этот самый эдит букв например через в OnKeyPress »
Johny777, напиши в обработчике OnKeyPress:
Код: Выделить весь код
if Pos(Key, '0123456789'#8) = 0 then Key := #0;
P.S. Но копипастой все равно можно будет вставить что угодно.

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

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

Отправлено: 13:13, 14-09-2012 | #926


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата El Sanchez:
если в х64 битной системе и файл расположен по пути "C:\Program Files\..." - то значок программы закреплаяется, но если запустить программу - создается еще один значок, »
Это нормально. Даже х64 приложения работают с эмуляцией х86. До сих пор. И это не более, чем косяк разработчиков. Обратите внимание, что далеко не все приложения так себя ведут. Поэтому способ добавления значка тут совершенно ни при чем, и работает он вполне корректно. а второй значек - при запуске приложения х64 - создается параллельный поток, в котором запускается тоже самое приложение, но в среде эмуляции х32 ( то, как я это вижу ), отсюда и появление второго значка - процесс-то уже другой.
Поправьте меня, если я не прав.

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

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

Отправлено: 13:28, 14-09-2012 | #927


Аватара для Ivan_009

Ветеран


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

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


Как сделать так чтобы если папка не пустая в которую устанавливается игра то выводилось сообщение типа:
Папка установки не пустая пожалуйста выберите другую!

Отправлено: 21:47, 14-09-2012 | #928


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

Ветеран


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

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


Ivan_009,
Код: Выделить весь код
[Setup]
DirExistsWarning=yes

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

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

Отправлено: 22:09, 14-09-2012 | #929


Аватара для MogilShik2007

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


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

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


Вложения
Тип файла: 7z Stronghold.7z
(234.2 Kb, 15 просмотров)

Помогите со скриптом, чет с чекбоксом не получается:
не отображается текст рядом с чекбоксом и не видит .ехе

Отправлено: 10:20, 15-09-2012 | #930



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




 
Переход