Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Простите...Что?
Хотите сказать, мой код у вас не компилировался и файлы лицензии не показывались в зависимости от языка?
Именно так.
В чистом виде ваш скрипт скомпилится, но при добавлении его кода в мой инсталляционный файл уже нет.
Проблема была вызвана несколькими причинами:
1. Я прописывыю ланги инсталлера в реестр:
!define MUI_LANGDLL_REGISTRY_ROOT "${PACK_UNINST_ROOT_KEY}"
!define MUI_LANGDLL_REGISTRY_KEY "${PACK_UNINST_KEY}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "${PACK_NAME_FILE}: Language"
2. Не использую !include "MUI2.nsh", работаю только с !include "MUI.nsh"
3. Резервирую файлы:
ReserveFile "setup.ini"
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
!insertmacro MUI_RESERVEFILE_LANGDLL
4. Не использую это:
!define MUI_LANGDLL_ALLLANGUAGES
5. Работаю только под Юникодом Нсис...
Переписав некоторые части кода и удалив лишнее, наконец-то удалось заставить вывести нормально файлик licence.rtf, именно из той папки откуда мне надо, а не из убого привязанной к корню Нсис... :)
Примерно так:
LicenseLangString mylicense ${LANG_ENGLISH} ".\licens\en\licence.rtf"
LicenseLangString mylicense ${LANG_ROMANIAN} ".\licens\ro\licence.rtf"
LicenseLangString mylicense ${LANG_GERMAN} ".\licens\de\licence.rtf"
LicenseLangString mylicense ${LANG_RUSSIAN} ".\licens\ru\licence.rtf"
LicenseLangString mylicense ${LANG_ITALIAN} ".\licens\it\licence.rtf"
LicenseLangString mylicense ${LANG_CZECH} ".\licens\cz\licence.rtf"
LicenseLangString mylicense ${LANG_POLISH} ".\licens\pl\licence.rtf"
LicenseLangString mylicense ${LANG_SPANISH} ".\licens\es\licence.rtf"
Зы, Да, чуть не забыл. Возможно, что ещё проблема в самих плагинах была, они у меня все были изначально, но один из них имел старую версию сборки, стянул поновее, с оф. форума Нсис в теме автора...
tony1990
26-08-2013, 17:08
Возникла такая проблемка. Делаю кастомную кнопку About на странице компонентов. Нужно чтобы эта кнопка была только на этой странице. Так вот при нажатии Back на странице компонентов возвращаемся на страницу директории и кнопки действительно нет. Дальше происходят чудеса. Нажимаем Next и снова Back и кнопка About сияет на странице директории. Как это можно победить? Сорри если такой вопрос уже был
!include "MUI2.nsh"
Name "About Button Example"
OutFile AboutButton.exe
InstallDir $TEMP
RequestExecutionLevel user
!define IDC_ABOUT 1300
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "DirectoryShow"
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "ComponentsLeave"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"
Section Install
SectionEnd
Function CompShowProc
System::Call 'user32::CreateWindowEx(i0,t"Button",t"About",i${BS_PUSHBUTTON}|${WS_CHILD}|${WS_VISIBLE}|${WS_TABSTOP},i30,i327,i80,i23,i$HWNDPARENT,i${IDC_ABOU T},ir0,i0)i.R0'
CreateFont $0 '$(^Font)' '$(^FontSize)'
SendMessage $R0 ${WM_SETFONT} $0 0
FunctionEnd
Function DirectoryShow
GetDlgItem $1 $HWNDPARENT 1300
EnableWindow $1 0
ShowWindow $1 0
FunctionEnd
Function ComponentsLeave
GetDlgItem $1 $HWNDPARENT 1300
EnableWindow $1 0
ShowWindow $1 0
FunctionEnd
kotkovets
26-08-2013, 17:40
Нужно чтобы эта кнопка была только на этой странице. Так вот при нажатии Back на странице компонентов возвращаемся на страницу директории и кнопки действительно нет. Дальше происходят чудеса. Нажимаем Next и снова Back и кнопка About сияет на странице директории. Как это можно победить? »
Элементарно, хендл кнопки по скрипту в переменной $R0:
System::Call 'user32::CreateWindowEx(....,ir0,i0)i.R0'
А значит почти все можно...
Function DirectoryShow
EnableWindow $R0 0
ShowWindow $R0 0
FunctionEnd
Function ComponentsLeave
EnableWindow $R0 0
ShowWindow $R0 0
FunctionEnd
tony1990
26-08-2013, 19:25
Спасибо огромное ! Всё работает !!!!! :yahoo:
tony1990
27-08-2013, 18:48
Есть ли способ вывести строку Space Available: на стандартной странице компонентов?
Есть ли способ вывести строку Space Available: на стандартной странице компонентов? »
Как уже было ранее рассмотрено - на любую стандартную страницу можно поместить дополнительный текст.
В твоём случае текст с информацией о свободном дисковом пространстве - на PAGE_COMPONENTS.
Это можно реализовать так :
!include "MUI2.nsh"
!include "Sections.nsh"
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW components_show
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
InstallDir "$TEMP"
OutFile "FreeSpace-test.exe"
Function .onInit
System::Call 'kernel32::GetDiskFreeSpaceEx(t"$instdir",*l.r1,*l,*l)'
System::Int64Op $1 / 1024
Pop $1
FunctionEnd
Function components_show
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,i40,i300,i20,i $0,i222,i0,i0) $R2'
GetDlgItem $1 $0 1027
GetDlgItem $2 $0 222
SendMessage $1 ${WM_GETFONT} 0 0 $3
SendMessage $2 ${WM_SETFONT} $3 1
FunctionEnd
SectionGroup /e "SectionGroup " SEC0
Section "Section 1" S1
SectionEnd
Section /o "Section 2" S2
SectionEnd
Section /o "Section 3" S3
SectionEnd
SectionGroupEnd
Только какой в этом смысл... Если уж определять свободный дисковый объём, то в связи с тем - достаточно ли места для устанавливаемых компонентов.
А с этим надо определяться сразу же после запуска инсталлятора. О чем выводить соответствующее сообщение.
PS Касательно кнопки на стандартных страницах... Пример был дан как пример, годный лишь для случая, когда ну позарез нужна кнопка именно на стандартной странице.
А вообще это извращение...
Как уже говорили ранее - кнопка нормально отображается только в верхней и нижней частях окна страницы. По центру она закрыта контролом области "поля-окна" стандартной страницы. А это, как оказалось, гадость ещё та (как и вообще, все стандартные страницы :) )...
Можно изменить размер этой закрываюшей кнопку области либо в ресурсе, либо через системные функции. Но это получится гемор, не стоящий того...
tony1990
28-08-2013, 16:57
Огромное спасибо !!!
Суть в специфике программы. Юзер выбирает разные компоненты, от этого зависит требуемый размер. Поэтому и хотелось чтобы требуемый и доступный размер были на странице компонентов.
А кнопку я решил внизу сделать всё-таки. Пока вроде работает :)
MKN, спасибо за код! Единственное - не читает шрифт в строку Space Available. Буду кумекать
tony1990,
Измени в GetDlgItem $1 $0 1027 - ID 1027 на 1006. Такой шрифт будет соответствовать тому, что на странице PAGE_COMPONENTS.
PS
222 - это ID нашего, созданного на странице, окна с надписью
Kopejkin
29-08-2013, 12:34
Если щелкать мышью в "переключателе" справа от компонентов, а не по ним, нужный компонент отмечается, но цветной прямоугольник выделения остается на компоненте, ранее выбранном щелчком по нему.
Можно ли вообще избавиться от выделения цветом?
http://savepic.su/3109965m.png (http://savepic.su/3109965.htm)
Переключатель компонентов с выделением активного жирным шрифтом.
; var_one-section.nsi
!include "Logiclib.nsh"
Name "One Section"
OutFile "one-section.exe"
RequestExecutionLevel user
; Pages
Page components
; Sections
Section /o "Option 1" g1o1
SectionEnd
Section /o "Option 2" g1o2
SectionEnd
Section /o "Option 3" g1o3
SectionEnd
Section /o "Option 4" g1o4
SectionEnd
Section /o "Option 5" g1o5
SectionEnd
Section /o "Option 6" g1o6
SectionEnd
Function .onInit
StrCpy $R9 ${g1o1}
SectionSetFlags ${g1o1} 9
FunctionEnd
Function .onSelChange
!insertmacro StartRadioButtons $R9
!insertmacro RadioButton ${g1o1}
!insertmacro RadioButton ${g1o2}
!insertmacro RadioButton ${g1o3}
!insertmacro RadioButton ${g1o4}
!insertmacro RadioButton ${g1o5}
!insertmacro RadioButton ${g1o6}
!insertmacro EndRadioButtons
SectionGetFlags ${g1o1} $R0
SectionGetFlags ${g1o2} $R1
SectionGetFlags ${g1o3} $R2
SectionGetFlags ${g1o4} $R3
SectionGetFlags ${g1o5} $R4
SectionGetFlags ${g1o6} $R5
${If} $R0 == 1
SectionSetFlags ${g1o1} 9
${ElseIf} $R0 == 8
SectionSetFlags ${g1o1} 0
${EndIf}
${If} $R1 == 1
SectionSetFlags ${g1o2} 9
${ElseIf} $R1 == 8
SectionSetFlags ${g1o2} 0
${EndIf}
${If} $R2 == 1
SectionSetFlags ${g1o3} 9
${ElseIf} $R2 == 8
SectionSetFlags ${g1o3} 0
${EndIf}
${If} $R3 == 1
SectionSetFlags ${g1o4} 9
${ElseIf} $R3 == 8
SectionSetFlags ${g1o4} 0
${EndIf}
${If} $R4 == 1
SectionSetFlags ${g1o5} 9
${ElseIf} $R4 == 8
SectionSetFlags ${g1o5} 0
${EndIf}
${If} $R5 == 1
SectionSetFlags ${g1o6} 9
${ElseIf} $R5 == 8
SectionSetFlags ${g1o6} 0
${EndIf}
FunctionEnd
Привет народ, опять я с неожиданной проблемой... :)
В скрипте имею 8 языков. Все было нормально и проблем никаких, до тех пор пока не добавил чешский. Появилась проблема, и откуда у нее ноги растут тоже не совсем понятно, хотя догадываюсь что где-то в ресурсах самого Нсис зарыта, в той части которая рулит лангами...
Суть проблемы в том, что у созданного деинсталлятора после инсталла и его запуска секция - "итальянская" накладывается на "чешскую" именем, т.е. вместо:
...
Деинсталлировать итальянскую версию.
Деинсталлировать чешскую версию.
...
Выводится:
...
Деинсталлировать итальянскую версию.
Деинсталлировать итальянскую версию.
...
При наведении курсора мыши на секцию, обе секции отображают правильный текст для лангов указанных версий.
В самих секциях тоже все ровно:
Инсталл
...
LangString inNameSecModFilesENG ${LANG_ITALIAN} "Installazione della versione inglese"
LangString inNameSecModFilesROM ${LANG_ITALIAN} "Installazione della versione romena"
LangString inNameSecModFilesGER ${LANG_ITALIAN} "Installazione della versione tedesca"
LangString inNameSecModFilesRUS ${LANG_ITALIAN} "Installazione della versione russa"
LangString inNameSecModFilesITA ${LANG_ITALIAN} "Installazione della versione italiana"
LangString inNameSecModFilesCEH ${LANG_ITALIAN} "Installazione della versione ceca"
LangString inNameSecModFilesPOL ${LANG_ITALIAN} "Installazione della versione polacca"
LangString inNameSecModFilesESP ${LANG_ITALIAN} "Installazione della versione spagnola"
LangString inNameSecModFilesENG ${LANG_CZECH} "Instalace anglické verze"
LangString inNameSecModFilesROM ${LANG_CZECH} "Instalace rumunské verze"
LangString inNameSecModFilesGER ${LANG_CZECH} "Instalace německé verze"
LangString inNameSecModFilesRUS ${LANG_CZECH} "Instalace ruské verze"
LangString inNameSecModFilesITA ${LANG_CZECH} "Instalace italské verze"
LangString inNameSecModFilesCEH ${LANG_CZECH} "Instalace české verze"
LangString inNameSecModFilesPOL ${LANG_CZECH} "Instalace polské verze"
LangString inNameSecModFilesESP ${LANG_CZECH} "Instalace španělské verze"
...
Деинсталл
...
LangString unNameSecModFilesENG ${LANG_ITALIAN} "Disinstallazione della versione inglese"
LangString unNameSecModFilesROM ${LANG_ITALIAN} "Disinstallazione della versione romena"
LangString unNameSecModFilesGER ${LANG_ITALIAN} "Disinstallazione della versione tedesca"
LangString unNameSecModFilesRUS ${LANG_ITALIAN} "Disinstallazione della versione russa"
LangString unNameSecModFilesITA ${LANG_ITALIAN} "Disinstallazione della versione italiana"
LangString unNameSecModFilesCEH ${LANG_ITALIAN} "Disinstallazione della versione ceca"
LangString unNameSecModFilesPOL ${LANG_ITALIAN} "Disinstallazione della versione polacca"
LangString unNameSecModFilesESP ${LANG_ITALIAN} "Disinstallazione della versione spagnola"
LangString unNameSecModFilesENG ${LANG_CZECH} "Odinstalace anglické verze"
LangString unNameSecModFilesROM ${LANG_CZECH} "Odinstalace rumunské verze"
LangString unNameSecModFilesGER ${LANG_CZECH} "Odinstalace německé verze"
LangString unNameSecModFilesRUS ${LANG_CZECH} "Odinstalace ruské verze"
LangString unNameSecModFilesITA ${LANG_CZECH} "Odinstalace italské verze"
LangString unNameSecModFilesCEH ${LANG_CZECH} "Odinstalace české verze"
LangString unNameSecModFilesPOL ${LANG_CZECH} "Odinstalace polské verze"
LangString unNameSecModFilesESP ${LANG_CZECH} "Odinstalace španělské verze"
...
Картинко:
http://i.imgur.com/j6bZ92E.png (http://imgur.com/j6bZ92E)
Сверху секции при установке, снизу деинсталл..
Собственно сам вопрос, в каком файле надо порыться чтобы это поправить?!
Зы, проверил на других лангах инстал и деинстал, пара - чешский итальянский глючат везде при деинсталляции...
kotkovets
29-08-2013, 20:30
Если щелкать мышью в "переключателе" справа от компонентов, а не по ним, нужный компонент отмечается, но цветной прямоугольник выделения остается на компоненте, ранее выбранном щелчком по нему.
Можно ли вообще избавиться от выделения цветом? »
у меня такого эффекта нет.. win7 x64
Собственно сам вопрос, в каком файле надо порыться чтобы это поправить?! »
в написанном скрипте..
Если щелкать мышью в "переключателе" справа от компонентов, а не по ним, нужный компонент отмечается, но цветной прямоугольник выделения остается на компоненте, ранее выбранном щелчком по нему. »
Посмотрел , как это выглядит на WinXP - действительно, есть такое остаточное явление...
Но, в то же время, в коде ранее предложенным kotkovets, (это где кнопка ДАЛЕЕ не активна пока не будет выбран 1 из компонентов ) - такого эффекта нет...
Повторю этот код :
OutFile "example.exe"
var hInst
!include "MUI2.nsh"
;функция во время открытия странички компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_SHOW
;---------------------------------------------------
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian
;макрос проверки секций, если одна из секций отмечена возврат - 1, иначе - 0;
;в intsec - указываем количество секций в скрипте
!macro CheckSection intsec ret
Push ${intsec}
System::Store SR2
${For} $R0 1 $R2
SectionGetFlags $R0 $R1
${IfThen} $R1 == 1 ${|}${Break}${|}
${Next}
Push $R1
System::Store L
Pop ${ret}
!macroend
SubSection "test" IDS_1
Section /o "Компонент №1" ID_1
SectionEnd
Section /o "Компонент №2" ID_2
SectionEnd
Section /o "Компонент №3" ID_3
SectionEnd
Section /o "Компонент №4" ID_4
SectionEnd
Section /o "Компонент №5" ID_5
SectionEnd
Section /o "Компонент №6" ID_6
SectionEnd
SubSectionEnd
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro RadioButton ${ID_3}
!insertmacro RadioButton ${ID_4}
!insertmacro RadioButton ${ID_5}
!insertmacro RadioButton ${ID_6}
!insertmacro EndRadioButtons
!insertmacro CheckSection 6 $R0
StrCmp $R0 0 0 +2
EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
StrCmp $R0 1 0 +2
EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd
Function .OnInit
StrCpy $1 ${ID_1}
;фиктивно отключаем группу
;SectionSetFlags ${IDS_1} ${SECTION_OFF}
SectionSetFlags ${IDS_1} -290 ; Чтобы компоненты в группе по умолчанию были свёрнуты :
FunctionEnd
Function COMPONENTS_SHOW
GetDlgItem $hInst $HWNDPARENT 1 ;находим HWND кнопки "установить"
!insertmacro CheckSection 6 $R0
StrCmp $R0 0 0 +2
EnableWindow $hInst ${SW_HIDE} ;отключаем кнопку "установить"
StrCmp $R0 1 0 +2
EnableWindow $hInst ${SW_SHOW} ;включаем кнопку "установить"
FunctionEnd
Как это понимать, я затрудняюсь комментировать...
Kopejkin
29-08-2013, 22:25
у меня такого эффекта нет.. win7 x64 »
Win7(x64) у меня тоже, а для тестирования есть несколько виртуалок.
На всех этот эффект есть.
...такого эффекта нет »
На этом скрипте тоже есть.
http://savepic.su/3090324m.png (http://savepic.su/3090324.htm).
Еще вопрос по NewAdvSplash. Указано, что можно воспроизвести *.mp3 и *.wav. WAV воспроизводится без проблем. а вот MP3 - нет.
Связано ли это с тем, что у меня не установлены никакие кодеки, кроме тех, что устанавливаются вместе с системой?
Еще ни разу не ощутил в них потребности, т.к. использую VLC Player. Если нужно чего перекодировать - Format Factory. Насколько я понимаю, эти программы используют свои кодеки автономно.
в написанном скрипте.. »
Угу, нашел это упущение и прибил... :)
Еще вопрос по NewAdvSplash. Указано, что можно воспроизвести *.mp3 и *.wav. WAV воспроизводится без проблем. а вот MP3 - нет.
Связано ли это с тем, что у меня не установлены никакие кодеки, кроме тех, что устанавливаются вместе с системой?
Еще ни разу не ощутил в них потребности, т.к. использую VLC Player. Если нужно чего перекодировать - Format Factory. Насколько я понимаю, эти программы используют свои кодеки автономно. »
Возможно здесь установленный Microsoft Visual C++ Redistributable_x86 2005 требуется...
kotkovets
30-08-2013, 14:31
...такого эффекта нет
я имел в ввиду не в скрипте, а в самой системе, независимо от скрипта..
Подскажите пожалуйста решение для такой задачи :
Необходимо определить тип файла у файла лишённого расширения. (такие файлы часто образуются при скачивании, часто встречается не правильное расширение у видео и у графики)
Также необходимо узнать название продукта у исполнямых exe-файлов не зависимо от их имени - blabla.exe ( в свойствах файла это - "Название продукта" )
Каким образом с помощью NSIS извлечь из файлов эту информацию ?
Предполагаю, что для этого можно использовать функцию System::Call `shell32::SHGetFileInfo (или SHGetFileInfoA )
совместно с флагами
SHGFI_TYPENAME (0x000000400)
SHGFI_EXETYPE (0x000002000)
SHGFI_DISPLAYNAME (0x000000200)
Но как ?
kotkovets
30-08-2013, 17:22
Каким образом с помощью NSIS извлечь из файлов эту информацию ? »
самый простой вариант: http://nsis.sourceforge.net/MoreInfo_plug-in
Необходимо определить тип файла у файла лишённого расширения »
каждый тип файла имеет свою уникальную сигнатуру, по гугли по определенным расширениям...
Читать файл нужно с помощью команды: FileReadByte побайтовое чтение файла с заданным смещением..
получили сигнатуру и сравниваем...
например архив rar имеет сигнатуру rar! в начале файла ( FileRead )
но потом нужно отсечь лишние символы - оставить первые 4 символа или 4 байта в двоичном ввиде через ( FileReadByte )
Читать файл нужно с помощью команды: FileReadByte побайтовое чтение файла с заданным смещением..
получили сигнатуру и сравниваем... »
Это сложно и совершенно не понятно , как реализовать в NSIS...
Тогда такой вопрос - если использовать знаменитую утилиту TrID - File Identifier ( http://mark0.net/soft-trid-e.html ) , то каким образом перенаправить содержимое из окна консоли в , скажем, текстовый файл, для дальнейшей обработки ?
kotkovets
31-08-2013, 11:53
Это сложно и совершенно не понятно , как реализовать в NSIS... »
че там сложного, главное знать, сколько байтов нужно прочитать, сигнатура файла одинакова для своего расширения...
пример на архиве 7z:
outfile test.exe
Section
fileopen $0 "file" r
filereadbyte $0 $1 ;читаем первый байт
filereadbyte $0 $2 ;читаем второй байт
fileclose $0
MessageBox MB_OK "Двоичный код: $1 $2" IDOK
IntFmt $1 "%c" $1 ;конвертируем код в символ
IntFmt $2 "%c" $2
MessageBox MB_OK "сигнатура: $1$2" IDOK
SectionEnd
exe файл сигнатура - MZ (первые два байта)
каким образом перенаправить содержимое из окна консоли в , скажем, текстовый файл »
bat файл:
trid -> text.txt
главное знать, сколько байтов нужно прочитать »
А как это узнать, если необходимо будет распознавать разнообразные расширения ?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC