|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум 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 |
|
Ветеран Сообщения: 2398
|
Профиль | Отправить 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 |
|
Ветеран Сообщения: 2398
|
Профиль | Отправить 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 |
|
Ветеран Сообщения: 2398
|
Профиль | Отправить 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 |
|
Ветеран Сообщения: 2398
|
Профиль | Отправить PM | Цитировать Цитата K.A.V.:
|
|
|
Отправлено: 15:15, 26-06-2014 | #1225 |
|
Ветеран Сообщения: 2398
|
Профиль | Отправить 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 |
|
Ветеран Сообщения: 2398
|
Профиль | Отправить 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 |
|
Ветеран Сообщения: 2398
|
Профиль | Отправить 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 | |
|