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

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

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

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

Ветеран


Contributor


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


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

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


Изменения
Автор: El Sanchez
Дата: 06-06-2020
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме
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] - Скачать;

  • RegExporter - Бесплатная утилита для экспорта реестра и конвертации файлов *.reg и *.ini в инсталляционные скрипты Inno Setup и NSIS.
    Последняя версия: 1.3.0 [17.01.2015] - Скачать;



Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Скрипты Inno Setup. Помощь и советы [часть 6] | Скрипты Inno Setup. Помощь и советы [часть 6].7z
Скрипты Inno Setup. Помощь и советы [часть 7] | Скрипты Inno Setup. Помощь и советы [часть 7].7z
Скрипты Inno Setup. Помощь и советы [часть 8] | Скрипты Inno Setup. Помощь и советы [часть 8].7z
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:09, 04-04-2018

 

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


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

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


Та я вроде не играю в Павлика Морозова.
четко сказал что нужно в инсталляторе прочитать свойство файла (Описание файла).

Отправлено: 19:57, 08-04-2022 | #761



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

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


Аватара для Vanadiy777

Ветеран


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

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


Цитата ivan_rolos:
четко сказал что нужно в инсталляторе прочитать свойство файла (Описание файла). »
ivan_rolos, сценарий инсталлятора дайте, может вместе что и придумаем...
Ну, или сами дальше тогда...

Отправлено: 20:55, 08-04-2022 | #762


Аватара для Flix

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


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

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


Цитата ivan_rolos:
Как можно прочитать свойства файла? »
Вот так.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:33, 08-04-2022 | #763


Аватара для Vanadiy777

Ветеран


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

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


Коллеги, всем доброго времени суток!

Подскажите пожалуйста, есть ли решение, как заменить иконку в MsgBox вместо mbError, mbInformation, и т.д. на свою, другую иконку, которая будет браться из системных файлов Windows?

Заранее, спасибо.

Отправлено: 15:19, 30-05-2022 | #764


Старожил


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

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


Vanadiy777,
В WinAPI есть функция MessageBoxIndirect, которая позволяет использовать произвольный значок.
Здесь на форуме есть её реализация (ссылка), но неполная -- требуется небольшой допилинг для загрузки своего значка.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:30, 31-05-2022 | #765


Аватара для Vanadiy777

Ветеран


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

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


iglezz, спасибо, буду изучать...
Правда не уверен, что получится, для меня сложновато...

Отправлено: 18:06, 31-05-2022 | #766


Старожил


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

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


Vanadiy777,
Поковырял тот образец, удалось в MessageBoxIndirect отобразить значок из 32/64-бит PE-файла (dll/exe/icl).
ico использовать нельзя.

Пример смогу выложить позже, т.к. код ещё причесать надо.

Последний раз редактировалось iglezz, 10-06-2022 в 16:10.

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

Отправлено: 20:19, 31-05-2022 | #767


Аватара для Vanadiy777

Ветеран


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

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


Цитата iglezz:
Пример смогу выложить позже, т.к. код ещё причесать надо. »
iglezz, буду Вам очень признателен, если поможете, т.к. сам, видимо, не разберусь...

Мне надо взять два разных значка из одной системной dll, и в зависимости от события вывести этот значок в MsgBox.

Отправлено: 20:57, 31-05-2022 | #768


Старожил


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

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


В итоге получилать такая матрёшка...

Функция MsgBoxEx (на базе MessageBoxIndirect) может служить полной заменой стандартному MsgBox.

MsgBoxEx('Сообщение', 'Заголовок', 0, ЗНАЧОК, ФЛАГИ) - стандартный значок
MsgBoxEx('Сообщение', 'Заголовок', '', ЗНАЧОК, ФЛАГИ) - значок из установщика
MsgBoxEx('Сообщение', 'Заголовок', 'ФАЙЛ', ЗНАЧОК, ФЛАГИ) - значок из 32/64-бит PE-файла (exe/dll/icl/...)

В константах IDI_SHIELD и IDI_APPLICATION два новых значка.

ЗНАЧОК задаётся константой MB_ICON*, IDI_* либо числом, либо 'строкой' ('MAINICON').

Если файл со значком открыть не удаётся, то устанавливается значок IDI_APPLICATION

Коды возврата, флаги, стандартные значки MB_ICON* соответствуют стандартному месседжбоксу.
пример.iss
Код: Выделить весь код
#define APPNAME "MessageBoxIndirect test"

[Setup]
AppName={#APPNAME}
AppVersion=0.1
DisableWelcomePage=yes
DefaultDirName={tmp}\{#APPNAME}
OutputDir=.
OutputBaseFilename={#APPNAME}
PrivilegesRequired=lowest


[code]
#include 'WinAPI_MessageBoxIndirect.pas'

procedure initializeWizard();
var
    dllname: String;
    ret: Integer;
begin
    // Standard icons:
    MsgBox('std mbInformation', mbInformation, MB_OK);
    MsgBoxEx('ex IDI_INFORMATION', '{#APPNAME}', 0, IDI_INFORMATION, MB_OK);
    MsgBox('std mbConfirmation', mbConfirmation, MB_OK);
    MsgBoxEx('ex IDI_QUESTION', '{#APPNAME}', 0, IDI_QUESTION, MB_OK);
    MsgBox('std mbError', mbError, MB_OK);
    MsgBoxEx('ex IDI_EXCLAMATION', '{#APPNAME}', 0, IDI_EXCLAMATION, MB_OK);
    MsgBox('std mbCriticalError', mbCriticalError, MB_OK);
    MsgBoxEx('ex IDI_ERROR', '{#APPNAME}', 0, IDI_ERROR, MB_OK);
    MsgBoxEx('ex IDI_SHIELD', '{#APPNAME}', 0, IDI_SHIELD, MB_OK);
    MsgBoxEx('ex IDI_APPLICATION', '{#APPNAME}', 0, IDI_APPLICATION, MB_OK);

    // Icon from installer
    MsgBoxEx('Installer icon', '{#APPNAME}', '', 'MAINICON', MB_OK)

    // Icon from exe/dll file
    dllname := 'C:\Program Files\Totalcmd\TOTALCMD.EXE'
    MsgBoxEx('app icon (text)'#10'from'#10+dllname, '{#APPNAME}', dllname, 'MAINICON', MB_OK)
    MsgBoxEx('app icon (num)'#10'from'#10+dllname, '{#APPNAME}', dllname, 6, MB_OK)

    // Icon from exe/dll file. failed to load.
    MsgBoxEx('LoadLibrary error', '{#APPNAME}', 'x:\notexist', 'MAINICON', MB_OK)

    // Return code test loop
    dllname := 'C:\Windows\SysWOW64\shell32.dll'
    while true do
    begin
        ret := MsgBoxEx('icon from'#10+dllname, '{#APPNAME}', dllname, 337, MB_YESNOCANCEL or MB_DEFBUTTON2);

        case ret of
            IDYES:
                ret := MsgBoxEx('YES'#10#10'Continue?', '{#APPNAME}', dllname, 16802, MB_YESNO);
            IDNO:
                ret := MsgBoxEx('NO'#10#10'Continue?', '{#APPNAME}', dllname, 240, MB_YESNO);
            IDCANCEL:
                ret := MsgBoxEx('CANCEL'#10#10'Continue?', '{#APPNAME}', dllname, 142, MB_YESNO);
        end;
        if ret = IDNO then break;
    end;


    Abort;
end;

подключаемый WinAPI_MessageBoxIndirect.pas
Код: Выделить весь код
#ifndef WinAPI_MessageBoxIndirect__pas
#define WinAPI_MessageBoxIndirect__pas


#include 'WinAPI.pas'
#include 'WinAPILoader.pas'

const
    // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox
    MB_CANCELTRYCONTINUE = $00000006;

    MB_ICONERROR = $00000010;
    MB_ICONSTOP = MB_ICONERROR;
    MB_ICONHAND = MB_ICONERROR;
    MB_ICONQUESTION = $00000020;
    MB_ICONWARNING = $00000030;
    MB_ICONEXCLAMATION = MB_ICONWARNING;
    MB_ICONINFORMATION = $00000040;
    MB_ICONASTERISK = MB_ICONINFORMATION;
    MB_USERICON = $00000080;

    // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadiconw
    IDI_APPLICATION = 32512;
    IDI_INFORMATION = 32516;
    IDI_ASTERISK = IDI_INFORMATION;
    IDI_ERROR = 32513;
    IDI_HAND = IDI_ERROR;
    IDI_WARNING = 32515;
    IDI_EXCLAMATION = IDI_WARNING;
    IDI_QUESTION = 32514;
    IDI_SHIELD = 32518;

    IDTRYAGAIN = 10;
    IDCONTINUE = 11;

type
    
    // MSGBOXPARAMSW structure
    // https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-msgboxparamsw
    // lpszIcon - string type
    _WinAPI_tagMSGBOXPARAMS_S = record
        cbSize: UINT;
        hwndOwner: HWND;
        hInstance: HINST;
        lpszText: String;
        lpszCaption: String;
        dwStyle: DWORD;
        lpszIcon: String;
        dwContextHelpId: DWORD_PTR;
        lpfnMsgBoxCallback: Pointer;
        dwLanguageId: DWORD;
    end;
    // lpszIcon - numeric type
    _WinAPI_tagMSGBOXPARAMS_N = record
        cbSize: UINT;
        hwndOwner: HWND;
        hInstance: HINST;
        lpszText: String;
        lpszCaption: String;
        dwStyle: DWORD;
        lpszIcon: DWORD;
        dwContextHelpId: DWORD_PTR;
        lpfnMsgBoxCallback: Pointer;
        dwLanguageId: DWORD;
    end;


//  https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxindirectw
function _WinAPI_MessageBoxIndirect_S(const MsgBoxParams: _WinAPI_tagMSGBOXPARAMS_S): Integer; external 'MessageBoxIndirectW@user32.dll stdcall';

function _WinAPI_MessageBoxIndirect_N(const MsgBoxParams: _WinAPI_tagMSGBOXPARAMS_N): Integer; external 'MessageBoxIndirectW@user32.dll stdcall';




function MsgBoxExNI(
                    const Text: String;
                    const Caption: String;
                    const hInstance: HINST;
                    const IconNumber: DWORD;
                    const Flags: DWORD
                    ): Integer;
var
    mp: _WinAPI_tagMSGBOXPARAMS_N;
begin
    mp.cbSize := SizeOf(mp);
    mp.hInstance := hInstance;
    mp.lpszText := Text;
    mp.lpszCaption := Caption;

    if (IconNumber < IDI_APPLICATION) and (hInstance = 0) then
        mp.dwStyle := Flags or IconNumber
    else
    begin
        mp.dwStyle := Flags or MB_USERICON;
        mp.lpszIcon := IconNumber;
    end;

    Result := _WinAPI_MessageBoxIndirect_N(mp);
end;


function MsgBoxExSI(
                    const Text: String;
                    const Caption: String;
                    const hInstance: HINST;
                    const IconName: String;
                    const Flags: DWORD
                    ): Integer;
var
    mp: _WinAPI_tagMSGBOXPARAMS_S;
begin
    mp.cbSize := SizeOf(mp);
    mp.hInstance := hInstance;
    mp.lpszText := Text;
    mp.lpszCaption := Caption;
    mp.dwStyle := Flags or MB_USERICON;
    mp.lpszIcon := IconName;

    Result := _WinAPI_MessageBoxIndirect_S(mp);
end;

(* function MsgBoxEx


    Text: `Messagebox text`

    Caption: `Messagebox caption`

    IconSource: 0      -- standard icons: MB_ICON*, IDI_*
              : ''     -- load icon from INSTALLER_EXE
              : 'FILE' -- load icon from FILE

    IconID: MB_ICON*, IDI_* -- if IconSource = 0
          : <icon name/number> if IconSource = '*'

    Flags:  MB_OK, MB_OKCANCEL, MB_ABORTRETRYIGNORE, MB_YESNOCANCEL, MB_YESNO,
            MB_RETRYCANCEL, MB_CANCELTRYCONTINUE,
            MB_DEFBUTTON1, MB_DEFBUTTON2, MB_DEFBUTTON3, MB_SETFOREGROUND


    Return: IDOK, IDCANCEL, IDABORT, IDRETRY, IDIGNORE, IDYES, IDNO, IDTRYAGAIN, IDCONTINUE
*)
function MsgBoxEx(
                  const Text: String;
                  const Caption: String;
                  const IconSource: Variant;
                  const IconID: Variant;
                  const Flags: DWORD
                ): Integer;
var
    hInstance: HINST;
    UsedIconID: Variant;
begin
    hInstance := 0;
    UsedIconID := IconID;

    if VarType(IconSource) <> varInteger then
    begin
        if IconSource = '' then
            hInstance := _WinAPI_GetModuleHandle('')
        else
            hInstance := _WinAPI_LoadLibraryEx(IconSource, 0, LOAD_LIBRARY_AS_IMAGE_RESOURCE);

        if hInstance = 0 then
            UsedIconID := IDI_APPLICATION // fallback to 'defaulticon'
    end;

    if VarType(UsedIconID) = varInteger then
        Result := MsgBoxExNI(Text, Caption, hInstance, UsedIconID, Flags)
    else
        Result := MsgBoxExSI(Text, Caption, hInstance, UsedIconID, Flags);

    if (hInstance > 0) and (IconSource <> '') then _WinAPI_FreeLibrary(hInstance);
end;


#endif

подключаемый WinAPILoader.pas
Код: Выделить весь код
#ifndef WinAPILoader__pas
#define WinAPILoader__pas


#include 'WinAPI.pas'

const
    LOAD_LIBRARY_AS_IMAGE_RESOURCE = $20;
    LOAD_LIBRARY_AS_DATAFILE = $2;

// https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexw
function _WinAPI_LoadLibraryEx(const lpLibFileName: String; const Zero: Integer; const dwFlags: DWORD): HINST; external 'LoadLibraryExW@Kernel32.dll stdcall';

// https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-freelibrary
function _WinAPI_FreeLibrary(const hLibModule: HINST): Boolean; external 'FreeLibrary@Kernel32.dll stdcall';

// https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlew
function _WinAPI_GetModuleHandle(const ModuleName: String): HINST; external 'GetModuleHandleW@Kernel32.dll stdcall';


#endif

подключаемый WinAPI.pas
Код: Выделить весь код
#ifndef WinAPI__pas
#define WinAPI__pas


type
    Pointer = Longint;

    HINST = THandle;


#endif


Пришлось использовать две разные структуры и функции, т.к. мне непонятно как можно числовое значение преобразовать в LPCWSTR.

Последний раз редактировалось iglezz, 10-06-2022 в 16:09.

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

Отправлено: 14:40, 01-06-2022 | #769


Аватара для Vanadiy777

Ветеран


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

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


iglezz,
Пример собрал, прикрутил все подключаемые модули. Все отрабатывает как надо.
Попробовал прикрутить к своему скрипту - отрабатывает окно MsgBoxEx, т.е. выскакивает второе окошко, но, ни заголовок окна, ни значок в окне не отображаются.
При этом все флаги отрабатывают. Т.е., функционал весь и работоспособность сохраняются.

Возможно, возникает конфликт с моим, имеющемся кодом...
Буду разбираться...

iglezz, Вам, от всей души, огромное спасибо за предоставленный материал и примеры!

Отправлено: 00:26, 08-06-2022 | #770



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 7] El Sanchez Автоматическая установка приложений 2499 02-02-2015 08:59
Скрипты Inno Setup. Помощь и советы [часть 6] El Sanchez Автоматическая установка приложений 2494 10-03-2014 11:51
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58




 
Переход