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

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

 

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


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

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


Цитата Johny777:
пихать в библиотеку это явно нет смысла »
теперь останется только поржать ))) нет слов.
Цитата Johny777:
сис меню больше не вызывается при клике по иконке »
вызывается. (по крайней мере у меня)

Последний раз редактировалось sergey3695, 09-02-2013 в 16:08.

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

Отправлено: 15:42, 09-02-2013 | #1631



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

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


Аватара для Johny777

Ветеран


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

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


Ну все! Добил код:
1. Хинтов нет. Через ISHint.dll работает как-то стрёмно (вырезал), Сам хинт создаётся через функцию CreateWindowEx(...) как здесь ( http://forum.vingrad.ru/forum/topic-...-system/0.html ), но в какой-то момент нужно отправить через SendMessage(... , LPARAM(PTOOLINFO(@g_toolItem))); адрес переменной, а вот это в инно не реализовать: LPARAM(PTOOLINFO(@g_toolItem)), а функции типа CallbackAddr(), только для переменных я не нашел. Короче забил. Думаю хинтами можно пренебречь. Лично мне они нафиг не нужны (и так понятно что крестик закрывает окно...)
2. Зато классно получилось подменённое сис. меню (var SysPopupMenu: TPopupMenu. Принцип такой:
создаём TPopupMenu функцией NewPopupMenu(), во входном параметре которой массив из TMenuItem. Их мы создаём функцией NewItem(), во входном параметре которой строка-текст айтема, а тут
(внимание) работает ещё одна функция (изменённая и упрощённая мной под собственные нужды) от South (оригинал тут http://forum.ru-board.com/topic.cgi?...83&limit=1&m=1 )
function GetMenuItemText(const hMenu: HMENU; const uIDItem: UINT; const Default: String): String;
hMenu - хэндл меню
uIDItem - индекс айтема
Default - если функция не отработает, то вернёт это имя для айтема
короче говоря мы перекидываем имена айтемов ('Закрыть', в английской винде 'Close', в китайской иероглифы) в своё меню из системного, чтоб не писать константы сообщений!
далее: Добавил сис. картинки (закрыть, свернуть) в меню функцией SetMenuItemBitmaps()
кто хочет свои картинки, то делается это так:
читать дальше »
Код: Выделить весь код
BitmapResource=Close:Close.bmp|Min:Min.bmp

...

var
  CloseBmp, MinBmp: TBitmap;

procedure InitializeWizard();
begin
  ...
    
  CloseBmp := TBitmap.Create;
  CloseBmp.LoadFromResourceName(HInstance, '_IS_CLOSE');
  MinBmp := TBitmap.Create;
  MinBmp.LoadFromResourceName(HInstance, '_IS_MIN');
  SetMenuItemBitmaps(SysPopupMenu.Handle, 0, MF_BYPOSITION, MinBmp.Handle, MinBmp.Handle);
  SetMenuItemBitmaps(SysPopupMenu.Handle, 1, MF_BYPOSITION, CloseBmp.Handle, CloseBmp.Handle);
end;


финальный код подмены сообщений:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=777
AppVerName=777
DefaultDirname={pf}\777


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


const
  GWL_WNDPROC = -4;
  WM_SYSCOMMAND = $0112;
  SC_MINIMIZE = 61472;
  SC_MAXIMIZE = 61488;
  SC_MOVE = 61456;
  WM_NCLBUTTONDBLCLK = $00A3;
  WM_NCLBUTTONDOWN = $00A1;
  WM_NCRBUTTONDOWN = $00A4;
  WM_NCMOUSEMOVE = $00A0;
  SC_CLOSE = 61536;
  SC_DRAGMOVE = $F012;
  WM_JOHNY = 7777;
  MF_BYPOSITION = $400;
  SC_SEPARATOR = 61455;
  MAX_PATH = 260;
  HBMMENU_CALLBACK = -1;
  HBMMENU_SYSTEM = 1;
  HBMMENU_MBAR_RESTORE = 2;
  HBMMENU_MBAR_MINIMIZE = 3;
  HBMMENU_MBAR_CLOSE = 5;
  HBMMENU_MBAR_CLOSE_D = 6;
  HBMMENU_MBAR_MINIMIZE_D = 7;
  HBMMENU_POPUP_CLOSE = 8;
  HBMMENU_POPUP_RESTORE = 9;
  HBMMENU_POPUP_MAXIMIZE = 10;
  HBMMENU_POPUP_MINIMIZE = 11;
    

type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  SHORT = Longint;
  HINST = THandle;
    

var
  OldWindowProc: Longint;
  SysPopupMenu: TPopupMenu;
    

function GetSystemMenu(hWnd: HWND; bRevert: BOOL): HMENU; external 'GetSystemMenu@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function GetWindowRect(hWnd: HWND; var lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall';
function ReleaseCapture: BOOL; external 'ReleaseCapture@user32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';
function SetMenuItemBitmaps(hMenu: HMENU; uPosition, uFlags: UINT; hBitmapUnchecked: HBITMAP; hBitmapChecked: HBITMAP): BOOL; external 'SetMenuItemBitmaps@user32.dll stdcall';
function GetMenuString(hMenu: HMENU; uIDItem: UINT; lpString: PChar; nMaxCount: Integer; uFlag: UINT): Integer; external 'GetMenuString{#A}@user32.dll stdcall';
function GetMenuItemText(const hMenu: HMENU; const uIDItem: UINT; const Default: String): String; // South
var
  Buff: String;
begin
  Result := Default;
  SetLength(Buff, MAX_PATH);
  if GetMenuString(hMenu, uIDItem, PChar(Buff), MAX_PATH, MF_BYPOSITION) > 0 then Result:= String(Buff);
end;


function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL;
begin
  Result := ShowWindow(FindWindowByClassName('#32774'), SW_HIDE);
end;


function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
  pt: TPoint;
  rt: TRect;
begin
  case Msg of
    WM_SYSCOMMAND: if wParam = SC_MAXIMIZE then
    begin
      wParam := 0;
      SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
    end;
    WM_NCMOUSEMOVE: EnumWindows(CallbackAddr('HideSystemTooltip'), 0);
    WM_NCLBUTTONDBLCLK: Msg := 0;
    WM_NCRBUTTONDOWN:
    begin
      Msg := 0;
      if GetCursorPos(pt) then SysPopupMenu.Popup(pt.x, pt.y);
    end;
    WM_NCLBUTTONDOWN:
    if GetCursorPos(pt) and GetWindowRect(hWnd, rt) then
    if (pt.x > rt.Left) and (pt.x < rt.Right-WizardForm.Width+27) and (pt.y > rt.Top) and (pt.y < rt.Bottom-WizardForm.Height+27) then
    begin
      Msg := 0;
      ReleaseCapture;
      SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    end;
    WM_JOHNY: MsgBox('демо подмены кнопок от Johny777 :)', mbInformation, MB_OK);
  end;
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;


procedure SysMenuOnClick(Sender: TObject);
begin
  case TMenuItem(Sender).Name of
    '_': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
    'X': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
    'M': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MOVE, 0);
    'Help', 'About': MsgBox(TMenuItem(Sender).Caption, mbError, MB_OK);
  end;
end;


procedure InitializeWizard();
var
    hSYSMENU: HWND;
begin
  WizardForm.BorderIcons := [biSystemMenu, biMaximize];
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
  hSYSMENU := GetSystemMenu(WizardForm.Handle, False);
  SysPopupMenu := NewPopupMenu(WizardForm, 'MyPopupMenu', paLeft, True, [
    NewItem(GetMenuItemText(hSYSMENU, 3, '&MINIMIZE'), 0, False, True, @SysMenuOnClick, 1, '_'),
    NewItem(GetMenuItemText(hSYSMENU, 6, '&CLOSE'), 0, False, True, @SysMenuOnClick, 2, 'X'),
    NewItem(GetMenuItemText(hSYSMENU, 1, '&MOVE'), 0, False, True, @SysMenuOnClick, 3, 'M'),
    NewLine,
    NewSubMenu('&Help', 0, 'mHelp', [
      NewItem('&Inno Setup Help', 0, False, True, @SysMenuOnClick, 4, 'Help'),
      NewItem('&About Inno Setup', 0, False, True, @SysMenuOnClick, 5, 'About')
    ], True)
  ]);
  SetMenuItemBitmaps(SysPopupMenu.Handle, 0, MF_BYPOSITION, HBMMENU_MBAR_MINIMIZE, HBMMENU_MBAR_MINIMIZE);
  SetMenuItemBitmaps(SysPopupMenu.Handle, 1, MF_BYPOSITION, HBMMENU_MBAR_CLOSE, HBMMENU_MBAR_CLOSE);
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpWelcome then SendMessage(WizardForm.Handle, WM_JOHNY, 0, 0);
end;


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


Дальнейшие улучшения кода с моей стороны не планируются. Пользуйтесь кто хочет, буду рад, только скин не забудьте перерисовать!

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

sergey3695,
Цитата sergey3695:
вызывается. (по крайней мере у меня) »
Я забыл установить Msg := 0; И если что, то нужно настраивать строку:
if (pt.x > rt.Left) and (pt.x < rt.Right-WizardForm.Width+27) and (pt.y > rt.Top) and (pt.y < rt.Bottom-WizardForm.Height+27) then
в ней должны быть точные координаты прямоугольника, в котором лежит иконка (они могут сбиться например из-за большего размера формы чем у меня ну или типа того)

Последний раз редактировалось Johny777, 10-02-2013 в 17:32. Причина: мелкое исправление

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

Отправлено: 17:12, 10-02-2013 | #1632


Аватара для Mailchik

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


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

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


Цитата Johny777:
Короче забил »
всё верно сделал.
один совет: в коде, используя такие строки:
Код: Выделить весь код
#ifdef UNICODE
  #define A "W"
#else
  #define A "A"
#endif
добавляй еще PChar = PAnsiChar, т.к. Unicode компилятор инно не знает просто PChar'а. то есть должно быть так:
Код: Выделить весь код
#ifdef UNICODE
  #define A "W"
  type
   PChar = PAnsiChar;
#else
  #define A "A"
#endif
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:49, 10-02-2013 | #1633


Аватара для TERMINAL

Ветеран


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

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


Подскажите плз, как и в какой секции нужно прописать условие чтобы при отсутствии ключа в реестре (HKEY_CURRENT_USER\Software\Test, "AppData", "REG_SZ", "7890" ) установщик (ехе) вообще не стартовал или если присутствует папка С:\{E99DDD46-1221-4DB4-81F0-F24D210EB41C} тогда разрешена установка?

Нашёл командную строку как компилировать скрипт Compil32.exe /cc "С:\Proekt\тест.iss", но мне нужно каждый раз создавать новый GUID-возможно сделать автоматическую генерацию нового GUID? Лучше вопрос, для чего нужен этот GUID-я думал для регистрации в реестре, но оказалось не так. Если мне нужно скомпилировать и получить 10 разных файлов ехе, для этого нужно генерировать GUID?

-------
Автоматизация прежде всего....


Последний раз редактировалось TERMINAL, 13-02-2013 в 15:24.


Отправлено: 14:41, 13-02-2013 | #1634


Ветеран


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

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


Gnom_aka_Lexander у тебя есть ещё IsPictures?

Отправлено: 23:12, 13-02-2013 | #1635


Аватара для Gnom_aka_Lexander

Ветеран


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

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


insombia, есть.

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

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

Отправлено: 09:55, 14-02-2013 | #1636


Ветеран


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

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


Gnom_aka_Lexander я бы скачал от тудого но ты меня там забанил за мультиакк

Отправлено: 13:53, 14-02-2013 | #1637


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

Ветеран


Contributor


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

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


Цитата TERMINAL:
Подскажите плз, как и в какой секции нужно прописать условие чтобы при отсутствии ключа в реестре (HKEY_CURRENT_USER\Software\Test, "AppData", "REG_SZ", "7890" ) установщик (ехе) вообще не стартовал или если присутствует папка С:\{E99DDD46-1221-4DB4-81F0-F24D210EB41C} тогда разрешена установка? »
TERMINAL,
Код: Выделить весь код
function InitializeSetup(): Boolean;
begin
    Result := RegKeyExists(HKCU, 'SOFTWARE\Test') or DirExists(ExpandConstant('{sd}\{{E99DDD46-1221-4DB4-81F0-F24D210EB41C}'));
end;
Цитата TERMINAL:
для чего нужен этот GUID-я думал для регистрации в реестре, но оказалось не так. »
TERMINAL, почему не так? Все так.

Цитата TERMINAL:
Если мне нужно скомпилировать и получить 10 разных файлов ехе, для этого нужно генерировать GUID? »
TERMINAL, можно и самому придумать 10 уникальных AppID.

Цитата TERMINAL:
Нашёл командную строку как компилировать скрипт Compil32.exe /cc "С:\Proekt\тест.iss", но мне нужно каждый раз создавать новый GUID-возможно сделать автоматическую генерацию нового GUID? »
TERMINAL, используйте препроцессор iscc.exe для компиляции. У него есть ключ /d, который позволяет декларировать препроцессорные константы и директивы. Допустим в секции Setup директива AppId объявлена через препроцессорную константу {#AppID}:
Код: Выделить весь код
[Setup]
AppID={#AppID}
Тогда из командной строки указать {#AppID} и скомпилировать скрипт можно так:
Код: Выделить весь код
iscc "/dAppID=тут уникальный Application ID" "С:\Proekt\тест.iss"
Декларацию константы {#AppID} в скрипте нужно закомментировать, так как парсится позже, чем указанная через комстроку. Консольных генераторов GUID полно, осталось оформить в виде батника, например.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:38, 14-02-2013 | #1638


Ветеран


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

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


как добавить создание новой папки сюда ?

Отправлено: 20:01, 14-02-2013 | #1639


Аватара для Mailchik

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


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

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


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

[Code]
procedure DirClick(Sender : TObject);
var
 s: string;
 begin
  if BrowseForFolder(WizardDirValue, s, True) then
   WizardForm.DirEdit.Text := s;
end;

procedure InitializeWizard;
 begin
  WizardForm.DirBrowseButton.OnClick := @DirClick;
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:36, 14-02-2013 | #1640



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




 
Переход