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

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

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

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

Ветеран


Contributor


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


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

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

 

Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата AndreY33_80:
mismatched or misplaced quotes on parameter "Filename" »
Цитата GOOGLE:
несоответствие или неуместные кавычки в параметре "Filename"
убери кавычки, у меня их не было.
Цитата Gnom_aka_Lexander:
Filename: {uninstallexe}; »

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

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

Отправлено: 20:34, 18-07-2012 | #441



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

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


Аватара для AndreY33_80

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


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

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


А окно при деинсталяции как можно скрыть ?

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


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Код: Выделить весь код
[Icons]
Name: {group}\{cm:UninstallProgram, My Application}; Filename: {uninstallexe}; Parameters: /VERYSILENT;

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

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

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


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


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

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


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

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


Аватара для mariolast

Ветеран


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

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


[q=El Sanchez]определение рабочей папки процесса:
« скрыть
Код:
Код: Выделить весь код
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_QUERY_INFORMATION = $400;
    PROCESS_VM_READ = $10;
    MAX_PATH = 260;

type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of char;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
#endif
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';


function GetProcessWorkingDirectory(ProcessName: String): TArrayOfString;
var
    hProcessSnap, hProc: THandle;
    pe32: TPROCESSENTRY32;
    szExeFile: array [0..MAX_PATH-1] of Char;
    szProcName: String;
    i, iLen: Integer;
begin
    SetArrayLength(Result, 0);
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    pe32.dwSize := sizeof(pe32);
    if not Process32First(hProcessSnap, pe32) then Exit;
    while Process32Next(hProcessSnap, pe32) do
    begin
        szProcName := '';
        while not (pe32.szExeFile[Length(szProcName)] = #0) do szProcName := szProcName + pe32.szExeFile[Length(szProcName)];
        if CompareText(szProcName, ProcessName) = 0 then
        begin
            hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pe32.th32ProcessID);
            iLen := GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH);
            if iLen > 0 then
            begin
                SetArrayLength(Result, GetArrayLength(Result)+1);
                for i := 0 to iLen-1 do Result[GetArrayLength(Result)-1] := Result[GetArrayLength(Result)-1] + szExeFile[i];
                Result[GetArrayLength(Result)-1] := RemoveBackSlash(ExtractFilePath(Result[GetArrayLength(Result)-1]));
            end;
            CloseHandle(hProc);
        end;
    end;
    CloseHandle(hProcessSnap);
end;

procedure InitializeWizard();
var
    szArray: TArrayOfString;
    i: Integer;
begin
    //хочу знать откуда калькуляторы запущены
    szArray := GetProcessWorkingDirectory('calc.exe');
    if GetArrayLength(szArray) > 0 then for i := 0 to GetArrayLength(szArray)-1 do MsgBox(szArray[i], mbInformation, MB_OK);
end;
С 64-битными процессами не катит. Как пример, калькулятор или ArchiCAD.exe на Windows7-64
ArchiCAD.exe 32-битный видится, 64-битный такой же процесс. нет.
Может кто поправить?

Отправлено: 09:54, 19-07-2012 | #445


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата Johny777:
реестр для меня тёмный лес »
Без разницы, в принципе. если запускать деинсталл напрямую - то тихого удаления не будет в любом случае. Тогда уж нужно объединять ярлык и реестр - ярлык дает тихое удаление из меню пуск а реестр - из панели управления.

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


Отправлено: 10:44, 19-07-2012 | #446


Аватара для Johny777

Ветеран


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

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


Gnom_aka_Lexander,

можно так (спасибо El Sanchez-у)
тихое удаление (с месседжбоксом "Да Нет" вначале и в конце (удаление завершено Ок)):
читать дальше »
Код: Выделить весь код
#define MyAppName "DisksInfo"

[Setup]
AppName=DisksInfo
VersionInfoVersion=7.1
AppVerName=DisksInfo
DefaultDirName={pf}\My program

[code]
function InitializeUninstall(): Boolean;
var
    Errorcode: Integer;
begin
    Result := False;

    if not UninstallSilent then
    begin
        Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
        Exit;
    end;

    if MsgBox(FmtMessage(SetupMessage(msgConfirmUninstall), ['{#MyAppName}']), mbInformation, MB_YESNO) = idYes then
    begin
        Result := True;
        MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#MyAppName}']), mbInformation, MB_OK);
    end
    else Result := False;
end;


полностью тихое удаление:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=DisksInfo
VersionInfoVersion=7.1
AppVerName=DisksInfo
DefaultDirName={pf}\My program

[code]
function InitializeUninstall(): Boolean;
var
    ErrorCode: Integer;
begin
    Result := False;

    if not UninstallSilent then
    begin
        Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
        Exit;
    end;

    Result := True;
end;


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

Цитата t16bz:
Возможно ли как-то изменить окно выбора папки установки? Если да, поделитесь, пожалуйста, примером. »
t16bz, выдираю у себя из скрипта!

читать дальше »
Код: Выделить весь код
[Setup]
AppId=The_Most_Beautiful_and_Unicue_AppId_Ever_Made
AppName=The_Best_App
VersionInfoVersion=7.1
AppVerName=The_Best
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\The_Best_App}


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


[CustomMessages]
Russian.Reset=Сброс
English.Reset=Reset


[code]
var
  BrowseForm: TSetupForm;
  DirTreeView: TFolderTreeView;
  Edit: TNewEdit;


procedure DirFolderChange(Sender: TObject);
begin
  if DirTreeView.Directory <> WizardForm.DirEdit.Text then
  Edit.Text := AddBackslash(DirTreeView.Directory) + '{#SetupSetting("AppName")}' else
  Edit.Text := DirTreeView.Directory;
end;


procedure BrowseForm_Buttons_OnClick(Sender: TObject);
begin
  case TButton(Sender).Tag of
    15: Edit.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#SetupSetting("DefaultDirName")}'));

    16: begin
          DirTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
          Edit.Text := AddBackslash(DirTreeView.Directory) + '{#SetupSetting("AppName")}';
        end;

    17: if Edit.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := Edit.Text;
  end;
end;



procedure BrowseClick(Sender: TObject);
begin
  BrowseForm := CreateCustomForm();
  with BrowseForm do
  begin
    Width := ScaleX(389);
    Height := ScaleY(390);
    Caption := SetupMessage(msgBrowseDialogTitle);
    CenterInsideControl(WizardForm, False);

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

    DirTreeView := TFolderTreeView.Create(nil)
    with DirTreeView do
    begin
      SetBounds(ScaleX(4), ScaleY(52), ScaleX(376), ScaleY(265));
      OnChange := @DirFolderChange;
      Parent := BrowseForm;
    end;

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

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(4), ScaleY(330), ScaleX(90), ScaleX(22));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonCancel);
      Cursor := crHand;
      ModalResult := mrCancel;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(99), ScaleY(330), ScaleX(90), ScaleY(22));
      Parent := BrowseForm;
      Caption := ExpandConstant('{cm:Reset}');
      Tag := 15;
      Cursor := crHand;
      OnClick := @BrowseForm_Buttons_OnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(194), ScaleY(330), ScaleX(90), ScaleY(22));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonNewFolder);
      Tag := 16;
      Cursor := crHand;
      OnClick := @BrowseForm_Buttons_OnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(289), ScaleY(330), ScaleX(90), ScaleY(22));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonOK);
      Tag := 17;
      OnClick := @BrowseForm_Buttons_OnClick;
      Cursor := crHand;
      ModalResult := mrOk;
    end;

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

procedure InitializeWizard;
begin
  WizardForm.DirBrowseButton.Hide;
  
  with TButton.Create(nil) do
  begin
    Parent := WizardForm.SelectDirPage;
    SetBounds(WizardForm.DirBrowseButton.Left, WizardForm.DirBrowseButton.Top, WizardForm.DirBrowseButton.Width, WizardForm.DirBrowseButton.Height - ScaleY(1));
    Caption := SetupMessage(msgButtonBrowse);
    OnClick := @BrowseClick;
    Cursor := crHand;
  end;
end;


отличия:
у меня по определённым причинам новая папка имеет название New Folder
здесь вернул константу
изменил координаты расположения окна (у меня окно инсталла больше стандартного и поэтому координаты другие)

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

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

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


Забанен


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

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


Привет.
Может кто подскажет,возможно ли как то сделать чтоб при нажатии например на кнопку Button появлялась форма?
На примере этого поста http://forum.oszone.net/post-1954373-453.html, только не выкатывалась а появлялась, ну в общем почти как контекстное меню.

Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Icons]
Name: "{commondesktop}\Моя программа"; Filename: "{app}\MyProg.exe"

[*Code]
var
  Button: TNewButton;
procedure RedesignWizardForm;
begin
  Button := TNewButton.Create(WizardForm);
  with Button do
  begin
    Name := 'Button';
    Parent := WizardForm.SelectProgramGroupPage;
    Left := ScaleX(342);
    Top := ScaleY(104);
    Width := ScaleX(75);
    Height := ScaleY(25);
  end;

  Button.TabOrder := 5;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;
Спасибо.

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


Забанен


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

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


Где посмотреть? Тихое удаление не нужно. Причём тут тихое удаление?
Надо чтоб например рядом с кнопкой [Обзор] была такая кнопочка со стрелочкой при нажатии на которую выпадала форма как контекстное меню. Только чтоб находилась рядом с кнопкой (под кнопкой), чтоб нельзя было двигать и не было крестика закрыть. Кликнул - Открылась, кликнул ещё раз или на основную форму или даже на рабочем столе, то она сама закрылась.

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

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

[Icons]
Name: "{group}\My Application"; Filename: "{app}\MyProg.exe"

[*Code]
var
  Button: TNewButton;

procedure Button1Click(Sender: TObject); forward;

function CreateForm: Integer;
begin
  with CreateCustomForm do
  begin
    ClientWidth := ScaleX(256);
    ClientHeight := ScaleY(256);
    Position := poScreenCenter;
    ShowModal;
    Free;
  end;
end;

procedure Button1Click(Sender: TObject);
begin
  CreateForm;
end;

procedure RedesignWizardForm;
begin
  with WizardForm.DirBrowseButton do
  begin
    Left := ScaleX(310);
  end;

  with WizardForm.DirEdit do
  begin
    Width := ScaleX(300);
  end;
  
  Button := TNewButton.Create(WizardForm);
  with Button do
  begin
    Name := 'Button';
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(384);
    Top := ScaleY(67);
    Width := ScaleX(27);
    Height := ScaleY(23);
    Caption := '..';
    OnClick := @Button1Click;
  end;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;
но не так.
Даже не знаю как объяснить.

Отправлено: 03:14, 20-07-2012 | #449


Аватара для Johny777

Ветеран


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

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


L1nk3R, ну ты чувак спросил
Цитата L1nk3R:
возможно ли как то сделать чтоб при нажатии например на кнопку Button появлялась форма? »
Цитата L1nk3R:
Где посмотреть? »
во второй половине адресованной товарищу t16bz пример в которм при нажатии на кнопку "обзор" создаётся форма обзора *(кастомная). Это самый точный ответ и был!
теперь я начал понимать...
ты ведь типа такого хочешь (контекстное меню = PopUp Menu выпадает из кнопки)?

пример:
читать дальше »
Код: Выделить весь код
#ifdef IS_ENHANCED
  #if (Ver < 0x5020300) || (Pos('ee', IS_Ver_Str) < 1)
    #pragma error 'Enhanced edition of Inno Setup (5.2.3.ee1 or higher) is required to compile this script'
  #endif
#else
  #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra	
PrivilegesRequired=none
OutputDir=userdocs:Inno Setup Examples Output

[code]
var
  PupMnu: TPopupMenu;
  btn: TButton;
  
procedure BtnOnClick(Sender: TObject);
var
  p: TPoint;
begin
  p.x := btn.Left;
  p.y := btn.Top + btn.Height;
  p := Wizardform.ClientToScreen(p);
  PupMnu.Popup(p.x, p.y);
end;

procedure Menu1OnClick(Sender: TObject);
begin
  MsgBox('Menu 1 OnClick!', mbInformation, MB_OK);
end;

procedure Menu2OnClick(Sender: TObject);
begin
  MsgBox('Menu 2 OnClick!', mbInformation, MB_OK);
end;

procedure InitializeWizard();
var
  Mnu: TMenuItem;
begin
  PupMnu := TPopupMenu.Create(WizardForm);
  // Menu 1
  Mnu := TMenuItem.Create(WizardForm);
  Mnu.Caption := 'Menu 1';
  Mnu.OnClick := @Menu1OnClick;
  PupMnu.Items.Add(Mnu);
  // Menu 2
  Mnu := TMenuItem.Create(WizardForm);
  Mnu.Caption := 'Menu 2';
  Mnu.OnClick := @Menu2OnClick;
  PupMnu.Items.Add(Mnu);
  // btn
  btn := TButton.Create(WizardForm);
  btn.Caption := 'Popup Menu';
  btn.SetBounds(ScaleX(10), ScaleY(320), ScaleX(100), ScaleY(28));
  btn.Parent := WizardForm;
  btn.OnClick := @BtnOnClick;
  btn.PopupMenu := PupMnu;
end;


и убери пожалуйста оба своих кода дополнительно под спойлер в [more] твой код [/more]

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

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

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



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




 
Переход