PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [26] 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

kotkovets
31-08-2013, 13:30
А как это узнать, если необходимо будет распознавать разнообразные расширения ? »
с помощью гугла или самостоятельно с помощью блокнота.. открыть блокнотом файл..
я сам только сейчас узнал сигнатуру 7z, exe - начало (первые 2 байта) всегда одинаковые...
более сложных случаях рекурсивно.. как программка ранее..

MKN
31-08-2013, 19:28
kotkovets,
Что то не так с сигнатурами.. К примеру, практически везде для 7z указывается сигнатура - 37 7A BC AF 27 1C
Т.е. - Sizet: 6 Bytes
http://www.filesignatures.net/index.php?search=7z&mode=EXT
http://file-extension.net/seeker/file_extension_7z
Tам ведь используется hexadecimal счисление ? Но тогда именно на него и надо ориентироваться... Как его считать из файла ?

kotkovets
31-08-2013, 22:20
Что то не так с сигнатурами.. К примеру, практически везде для 7z указывается сигнатура - 37 7A BC AF 27 1C »
все правильно... я ведь для простоты брал первые 2 байта... :)
Tам ведь используется hexadecimal счисление ? »
по ссылке в 16-ричном ввиде сигнатура, т.е с помощью калькулятора конвертируем:
[37 -->= 55] [7А --> =122] , что равно ASCII = 7z
---
NSIS выводит "байт" в десятичном виде
например, конвертация 16-ричное число в десятичное, десятичное в ASCII
IntFmt $1 "%i" 0x37 ;16-ричное число в десятичное
IntFmt $2 "%i" 0x7A ;16-ричное число в десятичное
;-------------------------------------------------------------------
IntFmt $1 "%c" $1 ;десятичное в ASCII
IntFmt $2 "%c" $2 ;десятичное в ASCII
;-------------------------------------------------------------------
MessageBox MB_OK "Сигнатура: $1$2" IDOK

конвертация десятичное число в 16-ричное число
IntFmt $3 "0x%X" 122
MessageBox MB_OK "16-ричное число: $3" IDOK

tony1990
01-09-2013, 16:39
Возвращаясь к вопросу о выводе строки Space available: на стандартной странице компонентов. Всё работает на ура до тех пор пока не начинаешь выбирать эти самые компоненты. Тут видать страница обновляется и созданная нами надпись про доступный размер на диске исчезает. Похоже, это нельзя обойти . Ежели только в исходниках нсиса не копаться. Да и то не поможет наверно.

MKN
01-09-2013, 20:27
kotkovets,
Благодарю за разъяснение.

ps На winamp.com , один добрый пользователь даже код-хедер подарил... Наверное корректно будет приаттачить его здесь ?

kotkovets
01-09-2013, 21:07
один добрый пользователь даже код-хедер подарил »
интересно "позырить" ..
ради пары строк - целый хедер.. :)

MKN
01-09-2013, 21:13
FTID.nsh - signature-based file type identification
автор aerDNA

Только что автор что то пофиксил :

kotkovets
01-09-2013, 21:25
Только что автор что то пофиксил »
архивов не хватает.. хотя добавить элементарно..

MKN
01-09-2013, 22:12
Тут видать страница обновляется и созданная нами надпись про доступный размер на диске исчезает. »
Можно попробовать сделать новое окно с надписью - всегда активным на переднем плане :
System::Call "user32::SetForegroundWindow(i r1) i."
http://www.rsdn.ru/article/qna/ui/wndsetfg.xml
Или зациклить контроль за активностью этого окна, типа как здесь : http://nsis.sourceforge.net/Allow_only_one_installer_instance
Не знаю , будет ли это работать для дочернего окна... Может kotkovets, подскажет...

dix75
02-09-2013, 16:09
Добрый день!

Возможно ли использовать одну и ту же функцию для install и deinstall секции

Есть функции BASE64 Encoding/Decoding Functions здесь (http://nsis.sourceforge.net/Base64)
Но как их заставить работать для деинсталл секции

kotkovets
02-09-2013, 17:23
Возможно ли использовать одну и
ту же функцию для install и
deinstall секции
да, пробуйте, а потом пишите о результатах..

dix75
02-09-2013, 18:01
В том то и дело, что нельзя

K.A.V.
02-09-2013, 21:20
Возвращаясь к вопросу о выводе строки Space available: на стандартной странице компонентов. Всё работает на ура до тех пор пока не начинаешь выбирать эти самые компоненты. Тут видать страница обновляется и созданная нами надпись про доступный размер на диске исчезает. Похоже, это нельзя обойти . Ежели только в исходниках нсиса не копаться. Да и то не поможет наверно. »
Со стандартной оболочкой? Что-то я не замечал таких проблем никогда, может, у вас в скрипте прописаны какие-то уникальные функции??

Добрый день!
Возможно ли использовать одну и ту же функцию для install и deinstall секции
Есть функции BASE64 Encoding/Decoding Functions здесь
Но как их заставить работать для деинсталл секции »
В том то и дело, что нельзя »
С чего вы взяли, что нельзя то? Вы пробовали?
Плохо пробовали, раз не работает ;)»
У вас же прописаны уже подобные функции в скрипте, если у вас прописаны команды деинсталлятора, вот возьмите, изучите скрипт, и всё поймёте...

Подсказка: ищите в скрипте слова, которые появляются в сообщениях при запуске программы удаления

MKN
03-09-2013, 09:26
Вызов стандартного диалога выбора каталога/файла (принтера/компьютера) c помощью функции SHBrowseForFolder

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

OutFile "SHBrowseForFolder_test.exe"

Section
StrCpy $9 "Folder Dialog Title"
System::Store "s r9"
; создаём структуру обозревателя
System::Call '*(i $HWNDPARENT, i 0, t "", t r9, i 0x40|0x4000, i 0, i, i) i.r1'
System::Call 'shell32::SHBrowseForFolderA(i r1) i.r2'
System::Free $1

;получаем путь для выбранной папки/файла
System::Call 'shell32::SHGetPathFromIDListA(i $2, t "" r3)'
MessageBox MB_OK "Selected : $3"

;Функция SHGetMalloc извлекает указатель на интерфейс IMalloc оболочки.
;Расширение оболочки должно использовать этот интерфейс для выделения памяти,
;позднее освобождаемой оболочкой.
System::Call 'shell32::SHGetMalloc(*i . r4)'
; IMalloc->Free call
System::Call '$4->5(i r2)'
; IMalloc->Release
System::Call '$4->2()'
System::Store "p3 l"
SectionEnd
Код этот обычно находится в функции, здесь в секции, лишь как пример.

Флаги BROWSEINFO structure ( BIF_BROWSEINCLUDEFILES )
http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205(v=vs.85).aspx
Флагов много, вот некоторые :
; 0x0000040 - с кнопкой "Создать папку"
; 0x00000200 - без кнопки "Создать папку"
; 0x00004000 - обзор, включая файлы
; 0x00000010 - с EditBox_ом над деревом папок
флаг можно записывать короче : 0x40 и т.д. , а также назначать через !define BIF_BROWSEINCLUDEFILES

ps если кто владеет программированием - может доработать диалог, как здесь :
http://www.manhunter.ru/assembler/236_tyuning_funkcii_shbrowseforfolder.html
Хорошо было бы приспособить этот тюнинг для NSIS, в виде плагина...

tony1990
03-09-2013, 13:51
K.A.V. : Со стандартной оболочкой? Что-то я не замечал таких проблем никогда, может, у вас в скрипте прописаны какие-то уникальные функции??


Ну вот простенький пример кода. Когда мы снимаем/ставим галочку у компонента, надпись Space available: исчезает.


!include "MUI2.nsh"

Name "Components Example"
OutFile Components.exe
InstallDir $TEMP

RequestExecutionLevel user

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"

Section "Component1"
SectionEnd

Section "Component2"
SectionEnd

Section "Component3"
SectionEnd


Function CompShowProc

System::Call 'kernel32::GetDiskFreeSpaceEx(t"$instdir",*l.r1,*l,*l)'
System::Int64Op $1 / 1024
Pop $1

StrCpy $4 'Space available: $1 KB'
FindWindow $0 "#32770" "" $HWNDPARENT
System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$4",i ${WS_CHILD}|${WS_VISIBLE},i0,i203,i150,i20,i $0,i222,i0,i0) $R2'

GetDlgItem $1 $0 1006
GetDlgItem $2 $0 222
SendMessage $1 ${WM_GETFONT} 0 0 $3
SendMessage $2 ${WM_SETFONT} $3 1

FunctionEnd

MKN
03-09-2013, 15:22
надпись Space available: исчезает. »
Потому, что ты не удачно переместил её в область контрола окна 1023, которое эту надпись и закрывает при обновлении инфы Space required e, когда отмечается компонент ...
В приведённом примере ведь всё на месте и никуда не исчезает.
Либо измени размер 1023, либо смести своё окно-надпись в свободное место. Те же грабли , что и с кнопкой...

MKN
05-09-2013, 17:55
Эффект "кругов на воде" на BMP рисунке.

Получается с помощью инносетаповской waterctrl.dll и следующего кода :

!AddPluginDir ".\"
!include MUI2.nsh

OutFile "WaterCtrl_test.exe"

ReserveFile waterctrl.dll
!define MUI_WELCOMEFINISHPAGE_BITMAP WizModernImage-Is.bmp
!define MUI_PAGE_CUSTOMFUNCTION_PRE pre
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE leave
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_Pre pre
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE leave
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

Function .onGUIEnd
SetPluginUnload manual
waterctrl::disablewater
System::Free
FunctionEnd

Function .onInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File waterctrl.dll
;SetOutPath $TEMP
FunctionEnd

Function Pre
; Load Image (LR_CREATEDIBSECTION|LR_LOADFROMFILE = 0x2010)
System::Call 'user32::LoadImage(i,t,i,i,i,i,) i (0,"$PLUGINSDIR\modern-wizard.bmp",0,0,0,0x2010) .s'
Pop $R0
System::Call '$PLUGINSDIR\waterctrl::enablewater(i,i,i,i,i,i) i ($HWNDPARENT,0,0,$R0,3,50)'
System::Call '$PLUGINSDIR\waterctrl::setwaterparent(i $HWNDPARENT)'
System::Call '$PLUGINSDIR\waterctrl::flattenwater()'
System::Call '$PLUGINSDIR\waterctrl::waterblob(i,i,i,i) i (70,198,10,1000)'
FunctionEnd

Function leave
System::Call '$PLUGINSDIR\waterctrl::disablewater()'
FunctionEnd

Section
Sleep 300
SectionEnd
Недостаток - ощутимая задержка после запуска перед появлением страницы.

MKN
06-09-2013, 10:49
Эффект пламени на BMP изображении

Для эффекта используется инносетаповская firectrl.dll. Т.к. пламя какое то бледненькое, лучше использовать WizModernImage-Is.bmp светлого цвета.

!AddPluginDir ".\"

!include MUI.nsh
OutFile "Flame_Effects_test.exe"

ReserveFile firectrl.dll
!define MUI_WELCOMEFINISHPAGE_BITMAP WizModernImage-Is.bmp
!define MUI_PAGE_CUSTOMFUNCTION_PRE pre
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE leave
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_Pre pre
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE leave
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"

Function .onGUIEnd
SetPluginUnload manual
firectrl::disablefire
System::Free
FunctionEnd

Function .onInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File firectrl.dll
SetOutPath $TEMP
FunctionEnd

Function Pre
System::Call 'user32::LoadImage(i,t,i,i,i,i,) i (0,"$PLUGINSDIR\modern-wizard.bmp",0,0,0,0x2010) .s'
Pop $R0
System::Call '$PLUGINSDIR\firectrl::enablefire(i,i,i,i,i) i ($HWNDPARENT,0,0,$R0,50)'
FunctionEnd

Function leave
System::Call '$PLUGINSDIR\firectrl::disablefire()'
FunctionEnd

Section
Sleep 300
SectionEnd
Недостаток тот же - тормоз перед открытием страницы.

tony1990
08-09-2013, 16:16
Положение окна 1023 получается регулировать, но вот его размеры нет. Меняю параметры, идущие за положением - на размеры окна они не влияют. Хотелось бы поместить всё-таки строчку о доступном размере на стандартное место, дабы не контрастировать с предыдущей страницей директории




!include "MUI2.nsh"
Name "Components Example"
OutFile Components.exe
InstallDir $TEMP
RequestExecutionLevel user

!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "English"

Section "Component1"
SectionEnd
Section "Component2"
SectionEnd
Section "Component3"
SectionEnd

Function CompShowProc
System::Call 'kernel32::GetDiskFreeSpaceEx(t"$instdir",*l.r1,*l,*l)'
System::Int64Op $1 / 1024
Pop $1

StrCpy $4 'Space available: $1 KB'
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $R5 $0 1023
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($R5, 0, 0, 180, 75, 10, 0x201)"
System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$4",i ${WS_CHILD}|${WS_VISIBLE},i0,i203,i150,i20,i $0,i222,i0,i0) $R2'
GetDlgItem $1 $0 1006
GetDlgItem $2 $0 222
SendMessage $1 ${WM_GETFONT} 0 0 $3
SendMessage $2 ${WM_SETFONT} $3 1
FunctionEnd

MKN
09-09-2013, 10:38
Положение окна 1023 получается регулировать, но вот его размеры нет. »
Не правильный синтаксис вызова функции. Надо так :
System::Call "User32::SetWindowPos(i$R5, i0, i0, i180, i150, i15, 0x0004)"
; Флаги устанавливают - исходя из задачи : http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx
; по русски : http://www.firststeps.ru/mfc/winapi/win/r.php?96
Только и так не очень правильно... Сначала создают Rect структуру, потом получают координаты окна, позицию которого надо изменить, задают новые координаты и потом уже применяют функцию SetWindowPos.
Также по хорошему, надо , сделать привязку к базовым единицам, чтобы при ином разрешении экрана, выбранные координаты не уехали... (А может и не обязательно... ) Гемор одним словом. Не проще ли подправить размер окна в ресурсах ?




© OSzone.net 2001-2012