.: NSIS - все вопросы :. часть 2.

Ответить
 • Просмотры: 43
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Цитата LOKYOXY:



New Interface NSIS
»




Если уж предлагать, то ВСЕ файлы для проекта. Для твоего примера требуется куча плагинов (locate.dll FindProcDLL.dll NSISVCLStyles.dll WndProc.dll

ToggleInstFiles.dll , возможно и ещё какие то. Просто надоело устанавливать...) Плюс ругань на !define PBM_SETBARCOLOR 0x111E (по моему вообще не нужен т.к. уже есть в хедере (хотя и не с такой константой... тоже вопрос... )

А в целом, овчинка, по моему, вообще не стоит выделки...
Аватара пользователя
Otlanta

Re: .: NSIS - все вопросы :. часть 2.

Сообщение Otlanta »

winver2.nsh определяет редакцию Windows 8 Single Language:



Код:

Код: Выделить всё

Windows 8 Single Language

поправьте пожалуйста чтоб обрезало Windows 8









Так же не определяет редакцию Home Premium французкой Windows 7 64-bit, пустое значение.

Ещё просьба сохранять winver2.nsh в UTF-8. Спасибо за плагин
Аватара пользователя
K.A.V.

Re: .: NSIS - все вопросы :. часть 2.

Сообщение K.A.V. »

Цитата 4eshireCat:



переименовать секцию в ini-файле
.: NSIS - все вопросы :. часть 2.




1. Секция - обычная строка, ini файл - обычный текстовый файл, отсюда делаем вывод, что можно переименовать секцию простой заменой строки (примеров с заменой уже тьма, к тому же в справочнике тоже есть примеры)

2. Можно воспользоваться плагином EnumINI (описание опять же, есть в справочнике), с помощью которого можно перечислить все параметры со значениями в конкретной секции (мы же знаем имя секции) - и просто записать все параметры со значением с новым именем секции, а секцию со старыми именем затем удалить



Если INI файл у вас не огромный по количеству строк (а, как мы знаем, у NSIS есть проблемы с чтением строк файла с большим количеством строк, когда скорость замедляется), то можно воспользоваться и первым методом
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Периодически необходимо перемещать или копировать файлы в папку, в которой уже имеются сотни файлов , в том числе и одноимённых (т.е. таких же, которые я копирую), которые потом нужно или удалить , или сравнить, или ещё чего...

Оказалось, сделать это удобно с помощью функции 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_MOVE = 0x0001 Перемеcтить файлы

Для копирования установить флаг 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

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Интересен код использования функции 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

i 50, i 450, i 185, i 255 - координаты и размер BMP рисунка

Есть правда досадный момент - изображение почему то не разрушается при закрытии инсталлятора (хотя DeleteObject предусмотрен в .onGUIEnd )

И изображение можно разрушить любым помещённым на него объектом...

Может кто подскажет, как это устранить ?

Пример во вложении :
Аватара пользователя
K.A.V.

Re: .: NSIS - все вопросы :. часть 2.

Сообщение K.A.V. »

Цитата Begin2Fly:



Подскажите, пожалуйста, как грамотнее реализовать создание чекбокса на MUI_PAGE_DIRECTORY.
.: NSIS - все вопросы :. часть 2.




Создать собственную страничку с нужными элементами и заменить ею стандартную страничку выбора каталога




Цитата Begin2Fly:



Отредактировал modern.exe, добавив туда чекбокс
.: NSIS - все вопросы :. часть 2.




"секс" с NSIS - это прекрасно Изображение

Если вы любите заниматься с NSIS этим, то давайте я вам объясню, как можно достигнуть пика наслаждения от корректного кода таким методом Изображение



1. Создаём Checkbox в modern.exe в диалоге 103, при создании обязательно ставим ему стиль BS_AUTOCHECKBOX

2. В поле ID элемента (я создавал элемент в ResHacker'e) вводим, например 5555, это обязательно, чтобы потом в коде мы смогли обратиться именно к нашему чекбоксу

3. В коде, после строки



Код:

Код: Выделить всё

!insertmacro MUI_PAGE_DIRECTORY

Добавляем



Код:

Код: Выделить всё

page custom MUI_PAGE_DIRECTORY_POST

И добавляем функцию, которая будет определять статус нашего чекбокса



Код:

Код: Выделить всё

Function MUI_PAGE_DIRECTORY_POST
 FindWindow $0 "#32770" "" $HWNDPARENT
 GetDlgItem $0 $0 5555
 SendMessage $0 ${BM_GETCHECK} "" "" $0
MessageBox MB_OK|MB_ICONINFORMATION "Статус чекбокса: $0"
FunctionEnd

Значение в переменной $0: 1 = чекбокс отмечен, 0 = не отмечен
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Цитата K.A.V.:



Создать собственную страничку с нужными элементами и заменить ею стандартную страничку выбора каталога
.: NSIS - все вопросы :. часть 2.




Можно, но не интересно.




Цитата K.A.V.:



"секс" с NSIS - это прекрасно
.: NSIS - все вопросы :. часть 2.




А вот это мне нравится Изображение



Спасибо за помощь, всё делал именно так, но не добавил:



Код:

Код: Выделить всё

page custom MUI_PAGE_DIRECTORY_POST
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Цитата Begin2Fly:



как грамотнее реализовать создание чекбокса на MUI_PAGE_DIRECTORY.
.: NSIS - все вопросы :. часть 2.




Грамотнее, наверное, с помощью CreateWindowEx.


Цитата Begin2Fly:



Отредактировал modern.exe, добавив туда чекбокс
.: NSIS - все вопросы :. часть 2.




А вот это, уже из разряда : Изображение


Цитата K.A.V.:



"секс" с NSIS - это прекрасно Если вы любите заниматься с NSIS этим
.: NSIS - все вопросы :. часть 2.




Изображение Может конечно, чуть проще, но редактирование ресурсов, это крайняк, когда уже ничего нельзя сделать по другому...

Ессно и то и другое - это результат, а значит имеет право быть.
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Есть полезный код, перечисляющий все дисковые устройства и их тип :





Код:

Код: Выделить всё

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

Вопрос : каким образом занести в одну (или несколько) переменную - ВСЕ полученные в цикле, данные ? Ведь количество дисков не предсказуемо...
Аватара пользователя
K.A.V.

Re: .: NSIS - все вопросы :. часть 2.

Сообщение K.A.V. »

Проблемка, как узнать Serial HDD, c помощью NSIS?
Ответить

Вернуться в «Автоматическая установка приложений»