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

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

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

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

Ветеран


Contributor


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


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

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


Изменения
Автор: Vadikan
Дата: 22-05-2012
Описание: Закрыто
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
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. Помощь и советы [часть 5]

Отправлено: 18:01, 29-08-2011

 

Аватара для valyok666

Старожил


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

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


XXXler, ну я просто хотел помочь

-------
Салтыков-Щедрин: "А надо учиться, учиться, учиться"


Отправлено: 14:32, 18-11-2011 | #161



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

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


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


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

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


R.i.m.s.k.y.,

Большое спасибо, проработала точно как надо

Еще вопрос... как тосле этого подать команду на рестарт?
Хотел реализовать через shellexec с помощью виндовского 'shutdown /r'.

Отправлено: 18:15, 18-11-2011 | #162


Аватара для Rikill

Старожил


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

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


leshcat,
[setup]
AlwaysRestart=yes

-------
"Око за око приведёт к слепоте мира"- Ганди


Отправлено: 18:31, 18-11-2011 | #163


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


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

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


Rikill,

Нет, это не то, нужна команда shellexec или exec

Отправлено: 18:42, 18-11-2011 | #164


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

Ветеран


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

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


Цитата leshcat:
Хотел реализовать через shellexec с помощью виндовского 'shutdown /r'. »
а что мешает реализовать с помощью виндовского 'shutdown /r?

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


Отправлено: 18:55, 18-11-2011 | #165


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

Ветеран


Contributor


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

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


Цитата Rikill:
а можно пример "хука на событие установки"? »
Rikill, событие отрисовки.

Цитата South:
смысла нет использовать для такой задачи хуки, достаточно сабклассинга »
South, спасибо, различия в терминах усвоил.

Пример кода отрисовки кастомного чекбокса. Реализовал 12 состояний. В качестве изображения для чекбокса взял btnimage.bmp из примеров Restools.
читать дальше »

Код: Выделить весь код
[Setup]
AppName=test
AppVerName=test
CreateAppDir=false
DefaultDirName={tmp}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
Uninstallable=false
AllowNoIcons=yes
BitmapResource=btn:{app}\btnimage.bmp

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[code]
type
    TPaintStruct = record
        hdc: Longint;
        fErase: BOOL;
        rcPaint: TRect;
        fRestore: BOOL;
        fIncUpdate: BOOL;
        rgbReserved: array [0..31] of byte;
    end;

    TCheckBoxArray = array of record
        Control: TWinControl;
        PrevWndProc: Longint;
    end;

const
    BM_GETCHECK = $F0;
    BM_GETSTATE = $F2;
    BST_UNCHECKED = $0;
    BST_CHECKED = $1;
    BST_INDETERMINATE = $2;
    BST_FOCUS = $8;
    BST_HOT = $200;
    BST_PUSHED = $4;
    CN_CTLCOLORSTATIC = $BD38;
    WM_PAINT = $F;
    COLOR_GRAYTEXT = 17;
    COLOR_BTNTEXT = 18;

var
    btn: TBitmapImage;
    ControlArray: TCheckBoxArray;

function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint;  external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function BeginPaint(hWnd: HWND; var lpPaint: TPaintStruct): Longint; external 'BeginPaint@user32.dll stdcall';
function EndPaint(hWnd: HWND; const lpPaint: TPaintStruct): Boolean; external 'EndPaint@user32.dll stdcall';
function InvalidateRect(hWnd: HWND; lpRect: Longint; bErase: Boolean): Boolean; external 'InvalidateRect@user32.dll stdcall';
function GdiTransparentBlt(hdcDest: Longint; xoriginDest, yoriginDest, wDest, hDest: Integer; hdcSrc: Longint; xoriginSrc, yoriginSrc, wSrc, hSrc: Integer; crTransparent: UINT): Boolean; external 'GdiTransparentBlt@gdi32.dll stdcall';
function DrawText(hDC: Longint; lpchText: PAnsiChar; nCount: Integer; var lpRect: TRect; uFormat: UINT): Integer; external 'DrawTextA@user32.dll stdcall';
function SetTextColor(hdc: Longint; crColor: DWORD): DWORD; external 'SetTextColor@gdi32.dll stdcall';
function SetBkMode(hdc: Longint; iBkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';
function SelectObject(hdc: Longint; hgdiobj: Longint): LongWord; external 'SelectObject@gdi32.dll stdcall';
function GetSysColor(nIndex: Integer): DWORD; external 'GetSysColor@user32.dll stdcall';


function WndProc(hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
var
    i, id: Integer;
    ps: TPaintStruct;
    rs: TRect;
begin
    Result := 0;
    i := GetWindowLong(hWnd, -21);
    case Msg of
        CN_CTLCOLORSTATIC: InvalidateRect(hWnd, 0, False);
        WM_PAINT: begin
            InvalidateRect(hWnd, 0, True);
            BeginPaint(hWnd, ps);
            case SendMessage(hWnd, BM_GETSTATE, 0, 0) of
                BST_UNCHECKED + BST_FOCUS: id := 9;                                  
                BST_CHECKED + BST_FOCUS: id := 13;
                BST_INDETERMINATE + BST_FOCUS: id := 17;

                BST_UNCHECKED + BST_HOT: id := 10;
                BST_CHECKED + BST_HOT: id := 14;
                BST_INDETERMINATE + BST_HOT: id := 18;

                BST_UNCHECKED + BST_FOCUS + BST_HOT: id := 10;
                BST_CHECKED + BST_FOCUS + BST_HOT: id := 14;
                BST_INDETERMINATE + BST_FOCUS + BST_HOT: id := 18;

                BST_UNCHECKED + BST_FOCUS + BST_HOT + 100: id := 11;
                BST_CHECKED + BST_FOCUS + BST_HOT + 100: id := 15;
                BST_INDETERMINATE + BST_FOCUS + BST_HOT + 100: id := 19;
                
                BST_UNCHECKED + BST_FOCUS + BST_HOT + 100 - BST_PUSHED: id := 11;
                BST_CHECKED + BST_FOCUS + BST_HOT + 100 - BST_PUSHED: id := 15;
                BST_INDETERMINATE + BST_FOCUS + BST_HOT + 100 - BST_PUSHED: id := 19;
                
                BST_UNCHECKED: id := 9;
                BST_CHECKED: id := 13;
                BST_INDETERMINATE: id := 17;
            end;
            if not TNewCheckBox(ControlArray[i].Control).Enabled then
            case SendMessage(hWnd, BM_GETCHECK, 0, 0) of
                BST_UNCHECKED: id := 12;
                BST_CHECKED: id := 16;
                BST_INDETERMINATE: id := 20;
            end;
            GdiTransparentBlt(ps.hdc, 0, 0, ps.rcPaint.Bottom, ps.rcPaint.Bottom, btn.Bitmap.Canvas.Handle, id*btn.Bitmap.Height, 0, btn.Bitmap.Height, btn.Bitmap.Height, clFuchsia);
            SelectObject(ps.hdc, TNewCheckBox(ControlArray[i].Control).Font.Handle);
            SetBkMode(ps.hdc, 1);
            if TNewCheckBox(ControlArray[i].Control).Enabled then
                SetTextColor(ps.hdc, GetSysColor(COLOR_BTNTEXT))  //ãëîáàëüíûé öâåò òåêñòà ÷åêáîêñà
            else
                SetTextColor(ps.hdc, GetSysColor(COLOR_GRAYTEXT));
            rs.Left := ps.rcPaint.Bottom;
            rs.Top := (ps.rcPaint.Bottom - TNewCheckBox(ControlArray[i].Control).Font.Size) div 4;  //ïîäãîíêà ïî âåðòèêàëè, íåîïòèìàëüíî
            rs.Right := ps.rcPaint.Right - rs.Left;
            rs.Bottom := ps.rcPaint.Bottom;
            DrawText(ps.hdc, TNewCheckBox(ControlArray[i].Control).Caption, Length(TNewCheckBox(ControlArray[i].Control).Caption), rs, 0);
            EndPaint(hWnd, ps);
        end;
        else Result := CallWindowProc(ControlArray[i].PrevWndProc, hWnd, Msg, wParam, lParam);
    end;
end;

procedure SetOwnerDrawCheckBox(Ctrl: TWinControl);
var
    i: Integer;
begin
    if Assigned(Ctrl) then
    begin
        for i := 0 to Ctrl.ControlCount-1 do if Ctrl.Controls[i] is TWinControl then
        begin
            if (Ctrl.Controls[i] is TNewCheckBox) then
            begin
                SetArrayLength(ControlArray, GetArrayLength(ControlArray)+1);
                ControlArray[GetArrayLength(ControlArray)-1].Control := TWinControl(Ctrl.Controls[i]);
                ControlArray[GetArrayLength(ControlArray)-1].PrevWndProc := SetWindowLong(TWinControl(Ctrl.Controls[i]).Handle, -4, CallbackAddr('WndProc'));
                SetWindowLong(TWinControl(Ctrl.Controls[i]).Handle, -21, GetArrayLength(ControlArray)-1);
            end;
            if TWinControl(Ctrl.Controls[i]).ControlCount > 0 then SetOwnerDrawCheckBox(TWinControl(Ctrl.Controls[i]));
        end;
    end;
    if not Assigned(Ctrl) then
    begin
        for i := 0 to GetArrayLength(ControlArray)-1 do SetWindowLong(ControlArray[i].Control.Handle, -4, ControlArray[i].PrevWndProc);
        SetArrayLength(ControlArray, 0);
    end;
end;


procedure InitializeWizard();
begin
    with WizardForm do
    begin
        OuterNotebook.Hide;
        NoIconsCheck.Parent := WizardForm;
        NoIconsCheck.Left := 100;
        //NoIconsCheck.Height := 24;
        NoIconsCheck.Show;
        NoIconsCheck.AllowGrayed := True;
        //NoIconsCheck.Enabled := False;
        btn := TBitmapImage.Create(WizardForm);
        btn.Bitmap.LoadFromResourceName(HInstance, '_IS_BTN');
    end;
    SetOwnerDrawCheckBox(WizardForm);
end;

procedure DeinitializeSetup();
begin
    SetOwnerDrawCheckBox(nil);
end;


upd
Доработал еще 9 состояний чекбокса

Последний раз редактировалось El Sanchez, 20-11-2011 в 18:01. Причина: допилил скрипт

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

Отправлено: 19:00, 18-11-2011 | #166


Забанен


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

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


Цитата leshcat:
Еще вопрос... как тосле этого подать команду на рестарт? »
Если так например?

читать дальше »
Код: Выделить весь код
[Run]
Filename: shutdown; Parameters: /r /t 10; Flags: runhidden

Отправлено: 06:42, 19-11-2011 | #167


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

Ветеран


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

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


Цитата Devils Night:
Если так например »
а разве не надо указывать полностью имя?
Код: Выделить весь код
[Run] 
Filename: shutdown.exe; Parameters: /r /t 10; Flags: runhidden

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


Отправлено: 07:16, 19-11-2011 | #168


Забанен


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

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


Цитата R.i.m.s.k.y.:
а разве не надо указывать полностью имя? »
у меня так отработало нормально,
пример из батника брал, там не каких exe не было, в оригинале вообще вот так было
Код: Выделить весь код
shutdown -r -t 1 -c

Последний раз редактировалось Devils Night, 19-11-2011 в 19:24.


Отправлено: 08:52, 19-11-2011 | #169


Аватара для OxFFEEDD

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


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

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


Всех приветствую.

Ищу варианты решения одной задачки, по этому решил задать вопросы здесь.

Интересует создание инсталлятора программы FlylinkDC++ для локальной сети, а в частности, сможет-ли движок Inno Setup проделать такой финт:
1. показать пользователю поле ввода для ника;
2. отобразить выпадающий список с ip адресами сетевых интерфейсов, существующих на данный момент в системе;
3. по результатам пользовательского ввода модифицировать файл настроек Flylink'а.

Самому писать инсталлятор пока лень, чувствую будет изобретён очередной велосипед, но и при беглом взгляде на возможности данного инсталлятора такого функционала сразу не нашёл, по этому спрашиваю у знающих людей...

Последний раз редактировалось OxFFEEDD, 19-11-2011 в 10:59.


Отправлено: 10:54, 19-11-2011 | #170



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

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Test ferget Тест-форум 0 24-08-2011 01:25
test ! ! Aaa ! ! Тест-форум 0 23-04-2011 11:29
test Santa aka Snt Тест-форум 0 16-04-2011 22:35
test xolod. Программное обеспечение Linux и FreeBSD 0 19-04-2009 21:03
Test memory KEugeNik Хочу все знать 11 23-11-2003 23:11




 
Переход