|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2. |
|
.: NSIS - все вопросы :. часть 2.
|
Ветеран Сообщения: 1216 |
![]() Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения. Описание: Текущая версия: NSIS 3.05 от 15 декабря 2019 года Скачать | Архив сборок версии Первая часть этой темы Скачать первую часть этой темы одним архивом ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов: Справочник по NSIS - создан силами нашего сообщества. Руководство пользователя. Перевод – Поляков А.В, зеркало Документация Утилиты разработчика Расширение функциональности Примеры скриптов на нашем форуме Скрипт NSIS для перепаковки AIMP2+Сборки Тема для Notepad++(пример парсинга XML) Достоинства Ещё немного полезной информации: |
|
------- Отправлено: 12:02, 09-12-2012 |
Пользователь Сообщения: 117
|
Профиль | Сайт | Отправить PM | Цитировать Сделал простенький сценарий для резервного копирования папки сохранений программы.
Программа создает сохранения на протяжении всего времени своей работы. Все хорошо работает, но есть один досадный нюанс. Предусмотрено, если выйти из программы, создание резервных копий прекращается и открывается папка сохранений. Но! Если интервал создания резервных копий сделать достаточно большим (мне нужно 10 минут), после выхода из программы приходится ждать завершения этого временнОго периода, что очень не удобно. Как сделать, чтобы выход из программы прерывал таймер отсчета времени? Не могу сообразить, что нужно сделать. Сценарий
Unicode true !include "MUI2.nsh" !include "Logiclib.nsh" !include "ProcessFunc.nsh" !include "FileFunc.nsh" Var datetime Var BackupDir Var SourseDir Name "SomeAPP Saver" OutFile "SomeAPP.Saver.exe" InstallDir "D:\SomeAPP\" ShowInstDetails show !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_LANGUAGE "English" RequestExecutionLevel admin !macro backupLoop Loop: ${If} ${ProcessExists} "SomeAPP.exe" ; дата в формате YYYY-MM-DD_HH-MM ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6 StrCpy $datetime "$0-$1-$2_$4-$5" ; Создание папки с меткой даты StrCpy $BackupDir "$LOCALAPPDATA\SomeAPP\Saved\$datetime_SomeAPPSaved" CreateDirectory $BackupDir ; Создание резервной копии папки 'SomeAPPSaved' в родительской папке StrCpy $SourseDir "$LOCALAPPDATA\SomeAPP\Saved\SomeAPPSaved" CopyFiles /SILENT "$SourseDir" "$BackupDir" Sleep 60000 ; 1 минута интервал повтора резервирования ${Else} Goto done ${EndIf} Goto Loop done: !macroend Section Exec "$INSTDIR\SomeAPP.exe" ${If} ${ProcessExists} "SomeAPP.exe" !insertmacro backupLoop Goto done1 ${Else} done1: ExecShell "open" "$LOCALAPPDATA\SomeAPP\Saved" ${EndIf} Quit SectionEnd Function .onVerifyInstDir IfFileExists "$INSTDIR\SomeAPP.exe" PathGood Abort PathGood: FunctionEnd |
Последний раз редактировалось Kopejkin, 05-04-2025 в 19:29. Отправлено: 13:06, 31-03-2025 | #2891 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 140
|
Профиль | Отправить PM | Цитировать Цитата Kopejkin:
|
|
Последний раз редактировалось Salmo, 04-04-2025 в 19:55. Отправлено: 19:48, 04-04-2025 | #2892 |
Пользователь Сообщения: 117
|
Профиль | Сайт | Отправить PM | Цитировать Спасибо, Salmo. Не сразу сообразил, как это работает. Буду играться интервалами и отсчетами.
|
Отправлено: 20:39, 05-04-2025 | #2893 |
Пользователь Сообщения: 140
|
Профиль | Отправить PM | Цитировать Kopejkin, Код простой, но есть недостаток. Если завершение программы произойдет в момент минутной паузы, то пока она длится, код дальше отрабатывать не будет. Есть решение с применением библиотеки ProcessFunc.nsh, написанной маэстро kotkovets
![]() ![]() |
Отправлено: 23:16, 05-04-2025 | #2894 |
Пользователь Сообщения: 117
|
Профиль | Сайт | Отправить PM | Цитировать Я тоже редко что-то новое (для себя) делаю в NSIS. Немного изменил числовые параметры вашего примера. Меня все устраивает и ждать ничего не нужно. В итоге я имею отслеживание запущенного процесса во время отсчета таймера и отображение обратного отсчета таймера над прогресбаром.
Скриншот и сценарий
![]() Unicode true !include "MUI2.nsh" !include "Logiclib.nsh" !include "ProcessFunc.nsh" !include "FileFunc.nsh" Var datetime Var BackupDir Var SourseDir Name "SomeAPP Saver" OutFile "SomeAPP.Saver.exe" InstallDir "D:\SomeAPP\" ShowInstDetails show !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_LANGUAGE "English" RequestExecutionLevel admin !macro backupLoop Loop: ${If} ${ProcessExists} "SomeAPP.exe" ; дата и текущее значение времени в формате ГГГГ ММ ДД ДН ЧЧ ММ СС ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6 ; MessageBox MB_OK|MB_ICONEXCLAMATION "$0 $1 $2 $3 $4 $5 $6" ; дата в формате YYYY-MM-DD_HH-MM для имени папки StrCpy $datetime "$2-$1-$0_$4-$5" ; Создание папки с меткой даты текущего времени StrCpy $BackupDir "$LOCALAPPDATA\SomeAPP\Saved\$datetime_SomeAPPSaved" CreateDirectory $BackupDir ; Создание резервной копии папки 'SomeAPPSaved' в родительской папке StrCpy $SourseDir "$LOCALAPPDATA\SomeAPP\Saved\SomeAPPSaved\*" CopyFiles /SILENT "$SourseDir" "$BackupDir" ; Код Salmo вместо Sleep 600000 - 10 минут интервал повтора резервирования StrCpy $7 600 ; количество отсчетов Sleep next: Sleep 1000 ; интервал отсчета 1 сек. ${FindProcessName} "SomeAPP.exe" $8 StrCmp $8 "1" 0 skip IntOp $7 $7 - 1 ; Обратный отсчет таймера над прогресбаром SetDetailsPrint textonly DetailPrint "До создания следующей резервной копии осталось $7 сек..." SetDetailsPrint listonly StrCmp $7 0 0 next skip: ${Else} Goto done ${EndIf} Goto Loop done: !macroend Section Exec "$INSTDIR\SomeAPP.exe" ${If} ${ProcessExists} "SomeAPP.exe" !insertmacro backupLoop Goto done1 ${Else} done1: ExecShell "open" "$LOCALAPPDATA\SomeAPP\Saved" ${EndIf} Quit SectionEnd Function .onVerifyInstDir IfFileExists "$INSTDIR\SomeAPP.exe" PathGood Abort PathGood: FunctionEnd |
Отправлено: 11:12, 06-04-2025 | #2895 |
Пользователь Сообщения: 140
|
Профиль | Отправить PM | Цитировать Цитата Kopejkin:
|
|
Отправлено: 15:14, 06-04-2025 | #2896 |
Пользователь Сообщения: 117
|
Профиль | Сайт | Отправить PM | Цитировать Когда-то MKN публиковал код, который позволял использовать BMP-картинку на стандартных страничках установщика.
Также было указано, что странички можно использовать по выбору. У меня не получается использовать только две странички: PAGE_DIRECTORY и PAGE_INSTFILES. Код работает только если дополнительно есть страничка PAGE_FINISH. Без нее не хочет компилироваться: Function: "DirectoryPageShow" Синтаксис: FindWindow $(user_var: handle output) WindowClass [WindowTitle] [Window_Parent] [Child_After] Ошибка в сценарии "D:\INSTALL_TEST\State Of Decay 2\bgbitmap-mkn2.nsi", строка 124 -- сборка прервана Может знает кто, как победить? Открыть код
!include MUI.nsh !include WinMessages.nsh ;size 497x314 !define BITMAP_FILE bg.bmp Name "Background Bitmap" OutFile "bgbitmap.exe" InstallDir "$TEMP" ShowInstDetails show !define MUI_COMPONENTSPAGE_NODESC !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_CUSTOMFUNCTION_GUIINIT MyGUIInit !define LR_LOADFROMFILE 0x0010 !define LR_CREATEDIBSECTION 0x2000 !define IMAGE_BITMAP 0 !define SS_BITMAP 0x0000000E !define WS_CHILD 0x40000000 !define WS_VISIBLE 0x10000000 !define HWND_TOP 0 !define SWP_NOSIZE 0x0001 !define SWP_NOMOVE 0x0002 !define IDC_BITMAP 1500 !define stRECT "(i, i, i, i) i" Var hBitmap !define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePageShow !insertmacro MUI_PAGE_WELCOME ;!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicensePageShow ;!insertmacro MUI_PAGE_LICENSE bgbitmap.nsi !define MUI_PAGE_CUSTOMFUNCTION_SHOW DirectoryPageShow !insertmacro MUI_PAGE_DIRECTORY !define MUI_PAGE_CUSTOMFUNCTION_SHOW ComponentsPageShow !insertmacro MUI_PAGE_COMPONENTS !define MUI_PAGE_CUSTOMFUNCTION_SHOW InstFilesPageShow !insertmacro MUI_PAGE_INSTFILES !define MUI_PAGE_CUSTOMFUNCTION_SHOW FinishPageShow !insertmacro MUI_PAGE_FINISH !insertmacro MUI_LANGUAGE English ; Destroy a window. !macro DestroyWindow HWND IDC GetDlgItem $R0 ${HWND} ${IDC} System::Call `user32::DestroyWindow(i R0)` !macroend ; Give window transparent background. !macro SetTransparent HWND IDC GetDlgItem $R0 ${HWND} ${IDC} SetCtlColors $R0 0xFFFFFF transparent !macroend ; Refresh window. !macro RefreshWindow HWND IDC GetDlgItem $R0 ${HWND} ${IDC} ShowWindow $R0 ${SW_HIDE} ShowWindow $R0 ${SW_SHOW} !macroend Function MyGUIInit InitPluginsDir ReserveFile `${BITMAP_FILE}` File `/ONAME=$PLUGINSDIR\bg.bmp` `${BITMAP_FILE}` ; Получение параметров родительского окна System::Call `*${stRECT} .R0` System::Call `user32::GetClientRect(i $HWNDPARENT, i R0)` System::Call `*$R0${stRECT} (, , .R1, .R2)` System::Free $R0 ; Создание нового окна и помещение в него изображения System::Call `kernel32::GetModuleHandle(i 0) i.R3` System::Call `user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i 0, i 0, i R1, i R2, i $HWNDPARENT, i ${IDC_BITMAP}, i R3, i 0) i.R1` System::Call `user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 0, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})` System::Call `user32::LoadImage(i 0, t "$PLUGINSDIR\bg.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s` Pop $hBitmap SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $hBitmap ; Установка прозрачности фона !insertmacro SetTransparent $HWNDPARENT 3 !insertmacro SetTransparent $HWNDPARENT 1 !insertmacro SetTransparent $HWNDPARENT 2 !insertmacro SetTransparent $HWNDPARENT 1034 !insertmacro SetTransparent $HWNDPARENT 1037 !insertmacro SetTransparent $HWNDPARENT 1038 ;Удаление не нужных контролов (элементов управления) !insertmacro DestroyWindow $HWNDPARENT 1256 !insertmacro DestroyWindow $HWNDPARENT 1028 !insertmacro DestroyWindow $HWNDPARENT 1039 FunctionEnd ;Обновление контролов родительского окна. Необходимо для некоторых элементов управления, ;если они имеют прозрачный фон. Function RefreshParentControls !insertmacro RefreshWindow $HWNDPARENT 1037 !insertmacro RefreshWindow $HWNDPARENT 1038 FunctionEnd Function WelcomePageShow SetCtlColors $MUI_HWND 0xFFFFFF transparent !insertmacro SetTransparent $MUI_HWND 1200 !insertmacro SetTransparent $MUI_HWND 1201 !insertmacro SetTransparent $MUI_HWND 1202 FunctionEnd /*; For license page. Function LicensePageShow FindWindow $MUI_HWND "#32770" "" $HWNDPARENT SetCtlColors $MUI_HWND 0xFFFFFF transparent !insertmacro SetTransparent $MUI_HWND 1040 !insertmacro SetTransparent $MUI_HWND 1000 !insertmacro SetTransparent $MUI_HWND 1006 !insertmacro SetTransparent $MUI_HWND 1034 !insertmacro SetTransparent $MUI_HWND 1035 Call RefreshParentControls FunctionEnd*/ Function DirectoryPageShow FindWindow $MUI_HWND "#32770" "" $HWNDPARENT SetCtlColors $MUI_HWND 0xFFFFFF transparent !insertmacro SetTransparent $MUI_HWND 1019 !insertmacro SetTransparent $MUI_HWND 1001 !insertmacro SetTransparent $MUI_HWND 1024 !insertmacro SetTransparent $MUI_HWND 1008 !insertmacro SetTransparent $MUI_HWND 1023 !insertmacro SetTransparent $MUI_HWND 1006 !insertmacro SetTransparent $MUI_HWND 1020 ; Remove group box text. $R0 still contains HWND of 1020 SendMessage $R0 ${WM_SETTEXT} 0 STR: ; Refresh controls. Call RefreshParentControls FunctionEnd Function ComponentsPageShow FindWindow $MUI_HWND "#32770" "" $HWNDPARENT SetCtlColors $MUI_HWND 0xFFFFFF transparent !insertmacro SetTransparent $MUI_HWND 1017 !insertmacro SetTransparent $MUI_HWND 1022 !insertmacro SetTransparent $MUI_HWND 1021 !insertmacro SetTransparent $MUI_HWND 1023 !insertmacro SetTransparent $MUI_HWND 1006 !insertmacro SetTransparent $MUI_HWND 1032 Call RefreshParentControls FunctionEnd Function InstFilesPageShow FindWindow $MUI_HWND "#32770" "" $HWNDPARENT SetCtlColors $MUI_HWND 0xFFFFFF transparent !insertmacro SetTransparent $MUI_HWND 1027 !insertmacro SetTransparent $MUI_HWND 1004 !insertmacro SetTransparent $MUI_HWND 1006 !insertmacro SetTransparent $MUI_HWND 1016 Call RefreshParentControls FunctionEnd Function FinishPageShow SetCtlColors $MUI_HWND 0xFFFFFF transparent !insertmacro SetTransparent $MUI_HWND 1200 !insertmacro SetTransparent $MUI_HWND 1201 !insertmacro SetTransparent $MUI_HWND 1202 !insertmacro SetTransparent $MUI_HWND 1203 !insertmacro SetTransparent $MUI_HWND 1204 !insertmacro SetTransparent $MUI_HWND 1205 !insertmacro SetTransparent $MUI_HWND 1206 FunctionEnd ; Free loaded resources. Destroy the bitmap. Function .onGUIEnd System::Call `gdi32::DeleteObject(i s)` $hBitmap FunctionEnd Section "Section1" SectionEnd |
Отправлено: 20:37, 06-04-2025 | #2897 |
Ветеран Сообщения: 2375
|
Профиль | Отправить PM | Цитировать Kopejkin,
Удали-закомментируй : ;!define MUI_PAGE_CUSTOMFUNCTION_SHOW FinishPageShow ;!insertmacro MUI_PAGE_FINISH ;Function FinishPageShow ;SetCtlColors $MUI_HWND 0xFFFFFF transparent ;!insertmacro SetTransparent $MUI_HWND 1200 ;!insertmacro SetTransparent $MUI_HWND 1201 ;!insertmacro SetTransparent $MUI_HWND 1202 ;!insertmacro SetTransparent $MUI_HWND 1203 ;!insertmacro SetTransparent $MUI_HWND 1204 ;!insertmacro SetTransparent $MUI_HWND 1205 ;!insertmacro SetTransparent $MUI_HWND 1206 ;FunctionEnd В остальном код рабочий, без ошибок (Проверил на W7 NSIS 3.9.0) |
Отправлено: 11:42, 07-04-2025 | #2898 |
Пользователь Сообщения: 117
|
Профиль | Сайт | Отправить PM | Цитировать Цитата MKN:
Проверял, какие комбинации работают в вашем сценарии (с комментированием соответствующих частей сценария) Работает комбинация страниц PAGE_WELCOME и PAGE_FINISH. Работает любая комбинация страницы PAGE_WELCOME и "внутренних" страниц отдельно, вместе и выборочно. Работает любая комбинация страницы PAGE_FINISH и "внутренних" страниц отдельно, вместе и выборочно. Любая комбинация "внутренних" четырех страниц НЕ РАБОТАЕТ. Хотя в стандартном сценарии любые комбинации страничек компилируются. Вопрос остается: как сделать, чтобы в сценарии MKN работала комбинация страниц PAGE_DIRECTORY и PAGE_INSTFILES? |
|
Последний раз редактировалось Kopejkin, 07-04-2025 в 17:14. Отправлено: 16:55, 07-04-2025 | #2899 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 | dimadr | Наборы обновлений для Windows XP/2003/Windows 7 | 267 | 14-02-2020 08:25 | |
[архив].: NSIS - все вопросы :. | kotkovets | Автоматическая установка приложений | 3387 | 09-12-2012 11:56 | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 | jameszero | Наборы обновлений для Windows XP/2003/Windows 7 | 1491 | 22-07-2011 22:42 | |
Выбор|модернизация процессора .:[все вопросы]:. Часть I | Myxa | Выбор отдельных компонентов компьютера и конфигурации в целом | 1845 | 01-01-2011 19:18 | |
Вопросы по создателю инсталляций NSIS | MaxDELETE | Программное обеспечение Windows | 14 | 04-07-2007 10:01 |
|