Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Ответить
Настройки темы
.: NSIS - все вопросы :. часть 2.

Аватара для kotkovets

Ветеран


Сообщения: 1216
Благодарности: 486


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: kotkovets
Дата: 07-06-2020
Описание: NSIS 3.05


Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения.


Описание:
читать дальше »
NSIS (Nullsoft Scriptable Install System) - профессиональная система для создания инсталляторов в среде Windows с октрытым исходным кодом. При своем малом размере система очень гибкая, и при с широкими возможностями. Генерируемый ею инсталлятор также имеет очень маленький размер и идеально подходит для распространения продукта через Интернет.


Текущая версия: NSIS 3.05 от 15 декабря 2019 года
Скачать | Архив сборок версии

Первая часть этой темы
Скачать первую часть этой темы одним архивом

ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества.
Руководство пользователя. Перевод – Поляков А.В, зеркало

Документация

Утилиты разработчика
Расширение функциональности

Примеры скриптов на нашем форуме
Скрипт NSIS для перепаковки AIMP2+Сборки
Тема для Notepad++(пример парсинга XML)

Достоинства
читать дальше »


◦ Очень маленький размер установочного блока (около 34 Кбайт)
◦ zlib, bzip2 и LZMA-сжатие
◦ Гибкая система скриптов (спецально разработанная для инсталляторов)
◦ Поддержка многоязычности, точнее 53 языка, есть возможность ввода нового языка
◦ Поддержка плагинов
◦ Скрипт Препроцессор
◦ Создание Web-инсталляторов


Ещё немного полезной информации:
читать дальше »

▫ История создания установщика

NSIS создан как альтернатива InstallShield, предназначенного для коммерческих продуктов.

NSIS был создан для распространения Winamp. Он базируется на предыдущем продукте Nullsoft — PiMP (plugin Mini Packager), иначе известным как SuperPiMP. После версии 2.0a0, проект был перемещён на SourceForge.net, где к работе над ним присоединились и сторонние разработчики. NSIS 2.0 был выпущен в свет 2 года спустя.

NSIS версии 1 был очень похож на классический Windows Installer, но он был более управлемым с помощью скриптов и поддерживал другие форматы сжатия. NSIS версии 2 поддерживает новый графический интерфейс пользователя, LZMA-сжатие, многоязычность и имеет хорошую систему плагинов.

Версия 2.01 была первой версией, поддерживающей компиляцию на любой из POSIX-платформ. Это позволило создавать Windows-инсталляторы на GNU/Linux и FreeBSD без использования эмулятора Wine. На данный момент поддерживается компиляция только для Windows.

▫ Описание

Компилятор NSIS — программа makensis — компилирует скрипты в исполняемый код. Каждая строчка скрипта содержит одну команду. Пример:
Код: Выделить весь код
 # Пример скрипта
 Name "Example1"
 OutFile "example1.exe"
 InstallDir "$PROGRAMFILES\Example1"
 Page Directory
 Page InstFiles
 Section
   SetOutPath $INSTDIR
   File ..\makensis.exe
 SectionEnd

Modern User Interface

В версии 2.0 был введён новый графический интерфейс пользователя, названный Modern UI (MUI). MUI очень похож на интерфейс мастеров, он поддерживает splash screen, выбора языка, выбор компонентов для установки и более широкие возможности настройки по сравнению со своим предшественником. Пример:
Код: Выделить весь код
 # Пример скрипта с Modern UI
 !include MUI.nsh
 Name "Example 2"
 OutFile Example2.exe
 !insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "license.rtf"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_LANGUAGE "German"
 !insertmacro MUI_LANGUAGE "French"
 Section "Extract makensis"
  SetOutPath $INSTDIR
  File ..\makensis.exe
 SectionEnd
NSIS может быть расширен при помощи плагинов, которые могут быть написаны на C++, Си, и Delphi. Плагины могут быть использованы для улучшения функциональности и интерфейса инсталлятора. Плагины могут быть вызваны в любой части кода NSIS скрипта.

С пакетом NSIS поставляются несколько плагинов, позволяющих добавлять новые страницы, заменять фоновые изображения, скачивать файлы из Интернета, выполнять математические вычисления, обновлять файлы и многое другое.

▫ Программы, использующие NSIS


◦ Антивирус Касперского
◦ Qip
◦ 3DNA Desktop
◦ 7-Zip
◦ ATI Display Driver
◦ CDex
◦ Dev-C++
◦ DivX
◦ eMule FileZilla
◦ Google Picasa
◦ Google Talk
◦ Intel C (компилятор)
◦ IrfanView
◦ LightAllow
◦ LyX
◦ Miranda IM Mozilla Firefox 2.0
◦ NASA World Wind
◦ Notepad++
◦ OpenOffice.org для Windows
◦ Pidgin
◦ VLC Player
◦ Winamp

▫ Чем я могу распаковать инсталлятор, созданный в NSIS?

В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции.


-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:02, 09-12-2012

 
MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


Цитата BuZzOFF:
На NSD можно сделать? »
Можно. Навскидку - так :

Код: Выделить весь код
!include "MUI2.nsh"
!include "CommCtrl.nsh"  ; из Спрвочника !
OutFile "LISTVIEW-CHECKBOXES.exe"
RequestExecutionLevel user
Page custom CreatePage
!insertmacro MUI_LANGUAGE "English"

Function CreatePage
!insertmacro MUI_HEADER_TEXT "LISTVIEW-CHECKBOXES" "LISTVIEW-CHECKBOXES"
nsDialogs::Create 1018
Pop $0
${NSD_CreateListView} 0u 0u 300u 120u "ListView"
Pop $1
SendMessage $1 ${LVM_SETBKCOLOR}     0 0xC7EDCC
SendMessage $1 ${LVM_SETTEXTBKCOLOR} 0 0xC7EDCC 
${NSD_LV_InsertColumn} $1 0 150 "Заголовок  - Столбец 1"
!define /math _LISTVIEW_TEMP_STYLE ${LVS_EX_CHECKBOXES} | ${LVS_EX_FULLROWSELECT}  
SendMessage $1 ${LVM_SETEXTENDEDLISTVIEWSTYLE} 0 ${_LISTVIEW_TEMP_STYLE} 
!undef _LISTVIEW_TEMP_STYLE
; =========================================================================
FileOpen $4 "$EXEDIR\myfile.txt" r
loop:
FileRead $4 $9 ; в $9 заносится содержимое строк из файла $4 ( построчно, с каждым циклом)
IntOp $R3 $R3 + 1  ; счетчик Item_ов
${NSD_LV_InsertItem} $1 $R3 "$9"  ; создание Item_ов в ListView
IfErrors +1 loop
FileClose $4
; =================================================================
  ; Установить состояние чекбоксов
  ${NSD_LV_SetCheckState} $1 0 1  ; отмечен
  ${NSD_LV_SetCheckState} $1 1 0  ; не отмечен
  ${NSD_LV_SetCheckState} $1 2 1  ; отмечен
  ; и т.д.
  ; кнопка контроля состояния чекбоксов
  ${NSD_CreateButton} 0u 124u 300u 15u "Проверка состояния чекбоксов" ;  
  Pop $2
  ${NSD_OnClick} $2 CheckItemState
  nsDialogs::Show
  System::Call `comctl32::ImageList_Destroy(iR0)`
FunctionEnd

Function CheckItemState
  ${NSD_LV_GetCheckState} $1 0 $R0
  ${NSD_LV_GetCheckState} $1 1 $R1
  ${NSD_LV_GetCheckState} $1 2 $R2
    ; и т.д.
  IntCmp $R0 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 0"
  IntCmp $R1 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 1"
  IntCmp $R2 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 2"
    ; и т.д.
  MessageBox MB_OK|MB_ICONINFORMATION "$R4"
FunctionEnd

Section
SectionEnd
CheckItemState наверняка можно сделать универсальной для любого кол-ва Item_ов. Неохота заморачиваться...
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:24, 17-07-2015 | #1681



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для BuZzOFF

Новый участник


Сообщения: 42
Благодарности: 4

Профиль | Отправить PM | Цитировать


Цитата MKN:
Можно. Навскидку - так : »
Круто! Настолько круто, что допилить до ума моих скудных знаний не хватит...


upd. Помогите, пожалуйста с CheckBox'ами. Как сделать проверку отметки универсальной, чтоб не руками вписывать, т.к. их количество будет каждый раз разное.

Последний раз редактировалось BuZzOFF, 17-07-2015 в 15:07.


Отправлено: 14:34, 17-07-2015 | #1682

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


Цитата BuZzOFF:
Как сделать проверку отметки универсальной »
Не совсем понятна твоя конечная цель... От этого ведь зависит алгоритм кода...
Можно такой вариант (если чисто для информации) - инфа об исходном, дефолтовом (до того, как пользователь их отметит или снимет отметку !) состоянии чекбоксов (можно по всякому сделать, в зависимости от цели) :
Код: Выделить весь код
 
Function CheckItemState
StrCpy $R5 0
loop:
IntOp $R5 $R5 + 1  ; счетчик номеров чекбоксов для GetCheckState
${NSD_LV_GetCheckState} $1 $R5 $R0 ; в $R0 - 1 или 0, в зависимости от исходной отметки чекбокса
StrCmp $R5 "$R3" Done  ;  выход из цикла после опроса последнего чекбокса
MessageBox MB_OK "Состояние чекбокса №$R5 - $R0"
Goto Loop
Done:
FunctionEnd

Последний раз редактировалось MKN, 17-07-2015 в 16:05.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:58, 17-07-2015 | #1683


Аватара для BuZzOFF

Новый участник


Сообщения: 42
Благодарности: 4

Профиль | Отправить PM | Цитировать


Цитата MKN:
Не совсем понятна твоя конечная цель... От этого ведь зависит алгоритм кода... »
Пользователь выберет нужные элементы, и дальше инсталлятор будет работать только с отмеченными (копирование файлов, запись в БД и т.д.).

Отправлено: 16:09, 17-07-2015 | #1684

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


Цитата BuZzOFF:
Пользователь выберет нужные элементы, и дальше инсталлятор будет работать только с отмеченными »
Тогда, первым делом переименуй кнопку ${NSD_CreateButton} 0u 124u 300u 15u "Install" .
Этой кнопкой будешь запускать инсталляцию после отметки чекбоксов, а родную кнопку Install - удаляешь со страницы

Функция почти такая же :
Код: Выделить весь код
Function CheckItemState
StrCpy $R5 -1	
loop:
IntOp $R5 $R5 + 1  ; счетчик номеров чекбоксов для GetCheckState
${NSD_LV_GetCheckState} $1 $R5 $R0 ;  в $R0 - 1 или 0 , в зависимости от отметки чекбокса
StrCmp $R5 "$R3" Done  ;  выход из цикла после опроса последнего чекбокса
;MessageBox MB_OK "Состояние чекбокса №$R5 - $R0"
StrCpy $R8 "$R8 $R0"
Goto Loop
Done:
StrCpy $R8 $R8 -1  ; отсекаем 1 последний символ строки
MessageBox MB_OK "$R8" ; в $R8 - строка с последовательностью  1 и 0 , т.е. отмеченных или не отмеченных чекбоксов
SendMessage $HWNDPARENT 0x408 1 0
FunctionEnd
Вот это: StrCpy $R5 -1 и вот это: StrCpy $R8 $R8 -1 - коррекция издержек счёта... Может можно и по другому, не разбирался, т.к. так работает нормально...

В итоге : в $R8 - строка с последовательностью 1 и 0 , т.е. отмеченных или не отмеченных всех чекбоксов
А далее, в зависимости от того, который по счёту символ в строке будет 1, т.е. отмеченным чекбоксом, то простой логикой, если символ под номером таким то (а это номер точно известного компонента) равен 1 , то он и устанавливается. Конечно можно и по другому. Но так , как мне кажется, будет проще...

Последний раз редактировалось MKN, 17-07-2015 в 17:52.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:46, 17-07-2015 | #1685


Аватара для BuZzOFF

Новый участник


Сообщения: 42
Благодарности: 4

Профиль | Отправить PM | Цитировать


Цитата MKN:
первым делом переименуй кнопку »
Интерфейс ещё будет меняться. С этим разберусь, это я могу
Огромнейшее спасибо! Я про этот ListView вообще не знал... Буду дальше разбираться.

Отправлено: 18:02, 17-07-2015 | #1686


Аватара для BuZzOFF

Новый участник


Сообщения: 42
Благодарности: 4

Профиль | Отправить PM | Цитировать


А ещё можно сделать так чтоб при выделении элемента отмечался/снимался CheckBox?
Нашёл нечто похожее:
Код: Выделить весь код
SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} ${LVS_EX_AUTOCHECKSELECT} ${LVS_EX_AUTOCHECKSELECT}



Но не то. Оно вон как отображается. CheckBox появляется только при наведении.

Отправлено: 19:41, 17-07-2015 | #1687


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


Сообщения: 1986
Благодарности: 723

Профиль | Сайт | Отправить PM | Цитировать


Цитата BuZzOFF:
А ещё можно сделать так чтоб при выделении элемента отмечался/снимался CheckBox? »
Если хотите творить на NSIS "по-настоящему" - углубляйтесь в познание WinAPI (что такое сообщения/уведомления и т.д.) и будет вам счастье

Код: Выделить весь код
!include "MUI2.nsh"
!include "CommCtrl_.nsh"  ; из Спрвочника !
OutFile "LISTVIEW-CHECKBOXES.exe"
RequestExecutionLevel user
Page custom CreatePage
!insertmacro MUI_LANGUAGE "English"

Function CreatePage
!insertmacro MUI_HEADER_TEXT "LISTVIEW-CHECKBOXES" "LISTVIEW-CHECKBOXES"
nsDialogs::Create 1018
Pop $0
${NSD_CreateListView} 0u 0u 300u 120u "ListView"
Pop $1
SendMessage $1 ${LVM_SETBKCOLOR}     0 0xC7EDCC
SendMessage $1 ${LVM_SETTEXTBKCOLOR} 0 0xC7EDCC 
${NSD_LV_InsertColumn} $1 0 150 "Заголовок  - Столбец 1"
!define /math _LISTVIEW_TEMP_STYLE ${LVS_EX_CHECKBOXES} | ${LVS_EX_FULLROWSELECT}
SendMessage $1 ${LVM_SETEXTENDEDLISTVIEWSTYLE} 0 ${_LISTVIEW_TEMP_STYLE} 
!undef _LISTVIEW_TEMP_STYLE

${NSD_OnNotify} $1 OnClickListView

; =========================================================================
FileOpen $4 "$EXEDIR\myfile.txt" r
loop:
FileRead $4 $9 ; в $9 заносится содержимое строк из файла $4 ( построчно, с каждым циклом)
IntOp $R3 $R3 + 1  ; счетчик Item_ов
${NSD_LV_InsertItem} $1 $R3 "$9"  ; создание Item_ов в ListView
IfErrors +1 loop
FileClose $4
; =================================================================
  ; Установить состояние чекбоксов
  ${NSD_LV_SetCheckState} $1 0 1  ; отмечен
  ${NSD_LV_SetCheckState} $1 1 0  ; не отмечен
  ${NSD_LV_SetCheckState} $1 2 1  ; отмечен
  ; и т.д.
  ; кнопка контроля состояния чекбоксов
  ${NSD_CreateButton} 0u 124u 300u 15u "Проверка состояния чекбоксов" ;  
  Pop $2
  ${NSD_OnClick} $2 CheckItemState
  nsDialogs::Show
  System::Call `comctl32::ImageList_Destroy(iR0)`
FunctionEnd

Function CheckItemState
  ${NSD_LV_GetCheckState} $1 0 $R0
  ${NSD_LV_GetCheckState} $1 1 $R1
  ${NSD_LV_GetCheckState} $1 2 $R2
    ; и т.д.
  IntCmp $R0 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 0"
  IntCmp $R1 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 1"
  IntCmp $R2 1 0 +2
  StrCpy $R4 "$R4$\r$\n  отмечен 2"
    ; и т.д.
  MessageBox MB_OK|MB_ICONINFORMATION "$R4"
FunctionEnd




Function OnClickListView
  System::Store SR2R1R0
  ${Select} $R1
     ${Case} ${NM_CLICK} ; если событие - клик мыши
      SendMessage $R2 ${LVM_GETHOTITEM} 0 0 $0 ; узнаём, на какой элемент пользователь нажал
      ${NSD_LV_GetCheckState} $1 $0 $2  ; узнаём статус галочки - стоит или не стоит
      ${If} $2 == "1" ; если галочка стоит
          ${NSD_LV_SetCheckState} $1 $0 0 ; снимаем галочку
       ${Else}
          ${NSD_LV_SetCheckState} $1 $0 1 ; ставим галочку, если не стоит
      ${EndIf}   
  ${EndSelect}
  System::Store L
FunctionEnd



Section
SectionEnd

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:50, 17-07-2015 | #1688

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


Когда то kotkovets сотворил интересный и полезный код - кнопочный тулбар из bmp

читать дальше »
Код: Выделить весь код
!include "CommCtrl.nsh"
!include "MUI2.nsh"

OutFile "ToolbarButton-test.exe"
ShowInstDetails Show

Page custom CreatePage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
xpstyle off

var dlg
var toolbar

!define ID_0   100
!define ID_1   101
!define ID_2   102
!define ID_3   103
!define ID_4   104
!define ID_5   105
!define ID_6   106
!define ID_7   107
!define ID_8   108
!define ID_9   109

Function CreatePage
    System::Call "comctl32::ImageList_Create(i32,i32,i${ILC_MASK}|${ILC_COLORDDB},i1,i0)i.R8" ;создаем имеджлист
    System::Call 'user32::LoadImage(i0,t"image-line.bmp",i${IMAGE_BITMAP},i0,i0,i${LR_LOADFROMFILE}|${LR_DEFAULTSIZE})i.R9'
    ;загружаем картинку в имеджлист первая картинку имеет индекс - 0
    System::Call "comctl32::ImageList_AddMasked(iR8,iR9,i${CLR_DEFAULT})"
    System::Call "gdi32::DeleteObject(iR9)"
    nsDialogs::Create 1044
    Pop $dlg
    ${NSD_CreateToolbar} 20u 5u 100% 40u ""
    Pop $toolbar
    ${NSD_AddStyle} $toolbar ${WS_BORDER}
    SendMessage $toolbar ${TB_BUTTONSTRUCTSIZE} 20 0
    SendMessage $toolbar ${TB_SETIMAGELIST} 0 $R8 ;созданный имеджлист помещаем на тулбар
    ${NSD_OnNotify} $toolbar toolbar
    
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_0} 0   ; ${NSD_TB_ADDBUTTONS} [хэндл контрола] [ID кнопки] [индекс картинки]
    ${NSD_TB_ADDSEPARATOR} $toolbar  ; добавляем сепаратор(разделитель)
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_1} 1
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_2} 2
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_3} 3
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_4} 4
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_5} 5
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_6} 6
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_7} 7
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_8} 8
    ${NSD_TB_ADDBUTTONS} $toolbar ${ID_9} 9
       
    nsDialogs::Show
    System::Call "comctl32::ImageList_Destroy(iR8)"
FunctionEnd

Function ID_LOAD
    MessageBox MB_OK "$R1 -->  ID_0" IDOK
FunctionEnd

Function ID_1
    MessageBox MB_OK "$R1 -->  ID_1" IDOK
FunctionEnd

Function ID_2
    MessageBox MB_OK "$R1 -->  ID_2" IDOK
FunctionEnd

Function ID_3
    MessageBox MB_OK "$R1 -->  ID_3" IDOK
FunctionEnd

Function ID_4
    MessageBox MB_OK "$R1 -->  ID_4" IDOK
FunctionEnd

Function ID_5
    MessageBox MB_OK "$R1 -->  ID_5" IDOK
FunctionEnd

Function ID_6
    MessageBox MB_OK "$R1 -->  ID_6" IDOK
FunctionEnd

Function ID_7
    MessageBox MB_OK "$R1 -->  ID_7" IDOK
FunctionEnd

Function ID_8
    MessageBox MB_OK "$R1 -->  ID_8" IDOK
FunctionEnd

Function ID_9
    MessageBox MB_OK "$R1 -->  ID_9" IDOK
FunctionEnd

Function toolbar
   System::Store SR2R1R0
   ; NM_CLICK уведомляет родительское окно органа управления, что пользователь щелкнул левой кнопкой мыши в пределах органа управления
   ${If} $R1 == ${NM_CLICK} ;уведомление о клике мыши по тулбару
       System::Call "*$R0(i,i,i,i.R1)"
       ${Select} $R1 ; в $R1 - возвращенный идентификатор кнопки
             ${Case} ${ID_0}
                 Call ID_LOAD
             ${Case} ${ID_1}
                 Call ID_1
             ${Case} ${ID_2}
                 Call ID_2
             ${Case} ${ID_3}
                 Call ID_3
             ${Case} ${ID_4}
                 Call ID_4
             ${Case} ${ID_5}
                 Call ID_5
             ${Case} ${ID_6}
                 Call ID_6
             ${Case} ${ID_7}
                 Call ID_7
             ${Case} ${ID_8}
                 Call ID_8
             ${Case} ${ID_9}
                 Call ID_9
       ${EndSelect}
   ${EndIf}
   System::Store L
FunctionEnd

Section ""
SectionEnd




Но к сожалению этот код нормально компилится только в версии NSIS 2.46. В NSIS 3 получаем ошибку...

И дело похоже в CommCtrl.nsh. Даже откорректированная для NSIS 3 ( из справочника) - не работает.
А не работает наверное потому , что в этом варианте CommCtrl.nsh нет макросов для Toolbar_а (__NSD_TB_ADDBUTTONS и сопутствующее добро... )

Как бы это дело подретушировать для NSIS 3 ? Я в сети находил вариант CommCtrl.nsh с нужными макросами, но подстановка их в CommCtrl.nsh всё равно приводит к ошибке...
читать дальше »
Код: Выделить весь код
${DEFINE} CMB_MASKED              0x02
${DEFINE} TBSTATE_CHECKED         0x01
${DEFINE} TBSTATE_PRESSED         0x02
${DEFINE} TBSTATE_ENABLED         0x04
${DEFINE} TBSTATE_HIDDEN          0x08
${DEFINE} TBSTATE_INDETERMINATE   0x10
${DEFINE} TBSTATE_WRAP            0x20
${DEFINE} TBSTATE_ELLIPSES        0x40
${DEFINE} TBSTATE_MARKED          0x80

${DEFINE} TB_ADDBUTTONS           1044
${DEFINE} TB_INSERTBUTTON         1045
${DEFINE} TB_DELETEBUTTON         1046
${DEFINE} TB_GETBUTTON            1047
${DEFINE} TB_BUTTONCOUNT          1048
${DEFINE} TB_COMMANDTOINDEX       1049
${DEFINE} TB_HITTEST              1093


#################################################################
# ${NSD_TB_ADDBUTTONS}                                          #
#################################################################

!macro __NSD_TB_ADDBUTTONS htoolbar_ ID_CODE_ IMAGE_
        !verbose push
	!verbose ${_COMMCTRL_NSH_VERBOSE}
   Push `${htoolbar_}`
   Push `${ID_CODE_}`
   Push `${IMAGE_}`
   ${CallArtificialFunction} __NSD_TB_ADDBUTTONS_Call
   !verbose pop
!macroend
!macro __NSD_TB_ADDBUTTONS_Call
    System::Store SR2R1R0
    System::Call "*(iR2, iR1, i${TBSTATE_ENABLED}, i${TBSTYLE_BUTTON}, i0, i0)i.R1"
    SendMessage $R0 ${TB_ADDBUTTONS} 1 $R1
    System::Free $R1
    System::Store L
!macroend
${DEFINE} NSD_TB_ADDBUTTONS "!insertmacro __NSD_TB_ADDBUTTONS"
#################################################################
!macro __NSD_TB_ADDSEPARATOR htoolbar_
   !verbose push
	!verbose ${_COMMCTRL_NSH_VERBOSE}
   Push `${htoolbar_}`
   ${CallArtificialFunction} __NSD_TB_ADDSEPARATOR_Call
   !verbose pop
!macroend
!macro __NSD_TB_ADDSEPARATOR_Call
    System::Store SR0
    System::Call "*(i-1, i0, i0, i${TBSTYLE_SEP}, i0, i0)i.R1"
    SendMessage $R0 ${TB_ADDBUTTONS} 1 $R1
    System::Free $R1
    System::Store L
!macroend
${DEFINE} NSD_TB_ADDSEPARATOR "!insertmacro __NSD_TB_ADDSEPARATOR"

!define __NSD_Toolbar_CLASS ${TOOLBARCLASSNAME}
;!define __NSD_Toolbar_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${TBSTYLE_TOOLTIPS}|${TBSTYLE_TRANSPARENT} ;|${CCS_NORESIZE}|${CCS_ADJUSTABLE}
 !define __NSD_Toolbar_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${TBSTYLE_TOOLTIPS}|${TBSTYLE_TRANSPARENT}|${CCS_NORESIZE}|${CCS_ADJUSTABLE}|${CCS_NODIVIDER}
!define __NSD_Toolbar_EXSTYLE 0

!insertmacro __NSD_DefineControl Toolbar

Последний раз редактировалось MKN, 27-05-2020 в 16:17.


Отправлено: 11:30, 18-07-2015 | #1689


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


Сообщения: 1986
Благодарности: 723

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: zip CommCtrl.zip
(14.3 Kb, 21 просмотров)

Цитата MKN:
Даже откорректированная для NSIS 3 ( из справочника) - не работает »

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]


Отправлено: 12:09, 18-07-2015 | #1690



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 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




 
Переход