|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9] |
|
|
Скрипты Inno Setup. Помощь и советы [часть 9]
|
|
Ветеран Сообщения: 1274 |
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы. Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах: Скрипты 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
|
Профиль | Отправить PM | Цитировать Та я вроде не играю в Павлика Морозова.
четко сказал что нужно в инсталляторе прочитать свойство файла (Описание файла). |
|
Отправлено: 19:57, 08-04-2022 | #761 |
|
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать Цитата ivan_rolos:
Ну, или сами дальше тогда... |
|
|
Отправлено: 20:55, 08-04-2022 | #762 |
|
Пользователь Сообщения: 98
|
Профиль | Отправить PM | Цитировать |
|
Отправлено: 21:33, 08-04-2022 | #763 |
|
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать Коллеги, всем доброго времени суток!
Подскажите пожалуйста, есть ли решение, как заменить иконку в MsgBox вместо mbError, mbInformation, и т.д. на свою, другую иконку, которая будет браться из системных файлов Windows? Заранее, спасибо. |
|
Отправлено: 15:19, 30-05-2022 | #764 |
|
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Vanadiy777,
В WinAPI есть функция MessageBoxIndirect, которая позволяет использовать произвольный значок. Здесь на форуме есть её реализация (ссылка), но неполная -- требуется небольшой допилинг для загрузки своего значка. |
|
Отправлено: 15:30, 31-05-2022 | #765 |
|
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать iglezz, спасибо, буду изучать...
Правда не уверен, что получится, для меня сложновато... |
|
Отправлено: 18:06, 31-05-2022 | #766 |
|
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Vanadiy777,
Поковырял тот образец, удалось в MessageBoxIndirect отобразить значок из 32/64-бит PE-файла (dll/exe/icl). ico использовать нельзя. Пример смогу выложить позже, т.к. код ещё причесать надо. |
|
Последний раз редактировалось iglezz, 10-06-2022 в 16:10. Отправлено: 20:19, 31-05-2022 | #767 |
|
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать Цитата iglezz:
Мне надо взять два разных значка из одной системной dll, и в зависимости от события вывести этот значок в MsgBox. |
|
|
Отправлено: 20:57, 31-05-2022 | #768 |
|
Старожил Сообщения: 352
|
Профиль | Отправить 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
Пришлось использовать две разные структуры и функции, т.к. мне непонятно как можно числовое значение преобразовать в LPCWSTR. |
|
Последний раз редактировалось iglezz, 10-06-2022 в 16:09. Отправлено: 14:40, 01-06-2022 | #769 |
|
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать iglezz,
Пример собрал, прикрутил все подключаемые модули. Все отрабатывает как надо. Попробовал прикрутить к своему скрипту - отрабатывает окно MsgBoxEx, т.е. выскакивает второе окошко, но, ни заголовок окна, ни значок в окне не отображаются. При этом все флаги отрабатывают. Т.е., функционал весь и работоспособность сохраняются. Возможно, возникает конфликт с моим, имеющемся кодом... Буду разбираться... iglezz, Вам, от всей души, огромное спасибо за предоставленный материал и примеры! |
|
Отправлено: 00:26, 08-06-2022 | #770 |
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| Скрипты 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 | |
|