|
Компьютерный форум 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 |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать COMPONENTSPAGE и PAGE_DIRECTORY на одной стандартной странице.
Такое сочетание более практично и удобно, чем раздельное листание страниц (хотя лучше это делать с помощью nsDialogs ) !AddPluginDir . !include "MUI2.nsh" !define SHACF_FILESYSTEM 0x00000001 !define EN_CHANGE 0x0300 Name "COMPONENTS_PAGE_DIRECTORY" OutFile "COMPONENTS_PAGE_DIRECTORY.exe" InstallDir $TEMP ShowInstDetails show !define MUI_COMPONENTSPAGE_NODESC ; correct modern_nodesc.exe !define MUI_UI_COMPONENTSPAGE_NODESC myui.exe !define MUI_PAGE_CUSTOMFUNCTION_SHOW DirPageShow !insertmacro MUI_PAGE_DIRECTORY !define MUI_PAGE_CUSTOMFUNCTION_SHOW HideBack !insertmacro MUI_PAGE_LICENSE ${__FILE__} !define MUI_COMPONENTSPAGE_TEXT_INSTTYPE $(^DirBrowseText) !define MUI_PAGE_CUSTOMFUNCTION_SHOW ComPageShow !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_LANGUAGE "English" Function DirPageShow FindWindow $1 "#32770" "" $HWNDPARENT System::Call User32::GetWindowLong(ir1,i4)i.R0 SendMessage $HWNDPARENT 0x408 1 0 FunctionEnd Function HideBack GetDlgItem $0 $HWNDPARENT 3 ShowWindow $0 ${SW_HIDE} FunctionEnd Function ComPageShow FindWindow $1 "#32770" "" $HWNDPARENT GetFunctionAddress $0 onComPageCallback WndProc::onCallback /r=1 $1 $0 GetDlgItem $0 $1 1001 SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^BrowseBtn)" GetDlgItem $0 $1 1007 SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^DirText)" GetDlgItem $0 $1 1020 SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^DirSubText)" GetDlgItem $0 $1 1019 SendMessage $0 ${WM_SETTEXT} 0 "STR:$INSTDIR" System::Call `shlwapi::SHAutoComplete(ir0,i${SHACF_FILESYSTEM})` FunctionEnd Function onComPageCallback ${If} $2 = ${WM_COMMAND} IntOp $5 $3 & 0x0000FFFF IntOp $6 $3 >> 16 IntOp $6 $6 & 0x0000FFFF ${If} $6 = ${EN_CHANGE} ${AndIf} $5 = 1019 System::Call User32::GetDlgItemText(ir1,i1019,t.d,i${NSIS_MAX_STRLEN}) ${EndIf} System::Call User32::CallWindowProc(iR0,ir1,ir2,ir3,ir4) ${EndIf} FunctionEnd Section "Components" Main SectionIn RO SectionEnd Section /o "Component1" Sec01 DetailPrint "Component 1" SectionEnd Section "Component 2" Sec02 DetailPrint "Component 2" SectionEnd WndProc.dll - плагин комплект во вложении : |
Последний раз редактировалось MKN, 27-05-2020 в 16:17. Отправлено: 15:42, 24-06-2014 | #1221 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Периодически необходимо перемещать или копировать файлы в папку, в которой уже имеются сотни файлов , в том числе и одноимённых (т.е. таких же, которые я копирую), которые потом нужно или удалить , или сравнить, или ещё чего...
Оказалось, сделать это удобно с помощью функции SHFileOperation, в которой предусмотрено создание копий одноимённых файлов. Функция SHFileOperation копирует, перемещает, переименовывает или удаляет объект в файловой системе. Функция имеет единственный аргумент - структуру типа TSHFileOpStruct, в которой и передаются все необходимые данные. http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx В зависимости от установленных флагов, производятся нужные операции с файлами. К примеру : переместить файлы из папки A в папку B и, если в папке B были одноимённые, файлы создать их копии в папке B System::Call "*(i $HWNDPARENT, i 0x0001, t 'C:\A\*.*',t 'C:\B', i 0x0008|0x0400, i0,i0,i0,&t${NSIS_MAX_STRLEN} r0,&t1 0)i .r0" System::Call "shell32::SHFileOperation(i r0)i .r1" System::Free $0 Для копирования установить флаг FO_COPY = 0x0002 Копировать файлы FOF_RENAMEONCOLLISION = 0x0008 В случае, если файл с данным именем уже существует, создается файл с именем "Copy #N of..." Наиболее известно применение этой функции для удаления пустых каталогов. Но бывает полезен и такой момент - удаление файлов в корзину. Например, при деинсталляции приложения, бывает необходимо сохранить пользовательские данные-файлы (проекты, шаблоны, INI, xml-файлы настроек и т.д.) И , даже если в Uninstaller_е предусмотрено соответсвующее сообщение, можно случайно пропустить его и удалить нужные файлы.. Тогда беда (для рядового пользователя,точно...) Поэтому, есть смысл, удалять ответственные файлы в корзину, с помощью SHFileOperation. System::Call "*(i $HWNDPARENT, i 0x0003, t 'C:\A\*.*',t , i 0x0040|0x0010|0x0400, i0,i0,i0,&t${NSIS_MAX_STRLEN} r0,&t1 0)i .r0" System::Call "shell32::SHFileOperation(i r0)i .r1" System::Free $0 FO_DELETE = 0x0003 - Удалить файлы FOF_ALLOWUNDO = 0x0040 Удалить файлы в корзину. FOF_NOERRORUI = 0x0400 - Не показывать сообщения об ошибках, которые могут возникнуть в течение процесса. FOF_NOCONFIRMATION = 0x0010 Отвечает "yes to all" на все запросы в ходе операции, т.е. не спрашивать у пользователя подтверждения удаления. если сообщение всё же желательно - этот флаг ессно не применяем ( Если надо удалить файлы вместе с папкой - не используем *.* ) |
Последний раз редактировалось MKN, 25-06-2014 в 15:15. Отправлено: 13:38, 25-06-2014 | #1222 |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Интересен код использования функции BitBlt. Можно рисовать рядом с окном инсталлятора (или в любом другом месте экрана) изображения, например, для наглядной демонстрации, при выборе компонентов или выборе скинов , тем, шаблонов и т.д.
outfile BitBlt_test.exe !define LR_LOADFROMFILE 0x0010 !define IMAGE_BITMAP 0 !define LR_CREATEDIBSECTION 0x00002000 Var hBitmap Var hDC Var hDCMem Var oldObject ; Функция BitBlt выполняет передачу битовых блоков данных о цвете, соответствующих прямоугольнику пикселей из заданного исходного контекста устройства ; в целевой контекст устройства. ; Растровая операция SRCCOPY 00CC0020 копирует исходный прямоугольник непосредственно в целевой прямоугольник Section StrCpy $0 $EXEDIR\vinni.bmp System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s' Pop $hBitmap System::Call "user32::GetDC(i R1) i.s" Pop $hDC System::Call "gdi32::CreateCompatibleDC(i $hDC) i.s" Pop $hDCMem System::Call "gdi32::SelectObject(i $hDCMem, i $hBitmap) i.s" Pop $oldObject System::Call "gdi32::BitBlt(i $hDC, i 50, i 50, i 185, i 255, i $hDCMem, i 0, i 0, i 0x00CC0020) i.s" System::Call "gdi32::BitBlt(i $hDC, i 50, i 450, i 185, i 255, i $hDCMem, i 0, i 0, i 0x00CC0020) i.s" SectionEnd Function .onGUIEnd System::Call `gdi32::DeleteObject(i s)` $hBitmap FunctionEnd Есть правда досадный момент - изображение почему то не разрушается при закрытии инсталлятора (хотя DeleteObject предусмотрен в .onGUIEnd ) И изображение можно разрушить любым помещённым на него объектом... Может кто подскажет, как это устранить ? Пример во вложении : |
Последний раз редактировалось MKN, 27-05-2020 в 16:17. Отправлено: 13:21, 26-06-2014 | #1223 |
![]() Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Цитата MKN:
Насчет разрушения не могу точно сказать, т.к. изображения сами разрушаются, но в описании DeleteObject сказано, что нужно передавать функции Цитата:
|
||
------- Отправлено: 13:40, 26-06-2014 | #1224 |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Цитата K.A.V.:
|
|
Отправлено: 15:15, 26-06-2014 | #1225 |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Иногда желательно обратить внимание пользователя на какое-либо сообщение программы. Сделать это можно сопроводив сообщение звуковым сигналом встроенного PC speaker_а (Beeper_a)
и функций winmm или kernel32 OutFile "Beep_test.exe" Section System::Call 'winmm::PlaySound(i0x2A53,i,i0x110001)' Sleep 1000 ; В траве сидел кузнечик System::Call 'kernel32::Beep(i 440,i 300) l' System::Call 'kernel32::Beep(i 329,i 300) l' System::Call 'kernel32::Beep(i 440,i 300) l' System::Call 'kernel32::Beep(i 329,i 300) l' System::Call 'kernel32::Beep(i 440,i 300) l' System::Call 'kernel32::Beep(i 415,i 300) l' System::Call 'kernel32::Beep(i 0,i 100) l' System::Call 'kernel32::Beep(i 415,i 300) l' SectionEnd ps Ессно бипер должен физически присутствовать в ПК и быть включен в : [HKEY_CURRENT_USER\Control Panel\Sound] "Beep"="yes" и в "Non Plug and Play Drivers" |
Последний раз редактировалось MKN, 27-06-2014 в 12:11. Отправлено: 11:50, 27-06-2014 | #1226 |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Есть полезный код, перечисляющий все дисковые устройства и их тип :
outfile GetLogicalDrives_GetDriveType.exe !include LogicLib.nsh ShowInstDetails show Section System::Call 'kernel32::GetLogicalDrives()i.r0' StrCpy $2 0 StrCpy $4 65 ; 'A' loop: IntOp $3 $0 & 1 ${If} $3 <> 0 IntFmt $3 "%c:\" $4 System::Call 'kernel32::GetDriveType(tr3)i.r5' DetailPrint "$3=$5" ${EndIf} IntOp $4 $4 + 1 IntOp $0 $0 >> 1 StrCmp $0 0 "" loop SectionEnd |
Отправлено: 12:38, 01-07-2014 | #1227 |
![]() Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Цитата MKN:
![]() Function .onInit call test MessageBox MB_OK|MB_ICONINFORMATION "$R0" quit FunctionEnd Function test StrCpy $R0 "" System::Call 'kernel32::GetLogicalDrives()i.r0' StrCpy $2 0 StrCpy $4 65 ; 'A' loop: IntOp $3 $0 & 1 ${If} $3 <> 0 IntFmt $3 "%c:\" $4 System::Call 'kernel32::GetDriveType(tr3)i.r5' DetailPrint "$3=$5" StrCpy $R0 "$R0 $3" ${EndIf} IntOp $4 $4 + 1 IntOp $0 $0 >> 1 StrCmp $0 0 "" loop FunctionEnd |
|
------- Отправлено: 13:03, 01-07-2014 | #1228 |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Цитата K.A.V.:
![]() |
|
Отправлено: 15:15, 01-07-2014 | #1229 |
Новый участник Сообщения: 19
|
Профиль | Отправить PM | Цитировать Всем привет, как определить дату модификации файла с помощью NSIS?
|
Отправлено: 15:23, 11-07-2014 | #1230 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 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 |
|