Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Kopejkin
24-08-2015, 00:11
...не все мелочи там указаны... »
Как бы, название Справочник подразумевает отсутствие не указания таких мелочей.
откройте.., найдите... и посмотрите..»
Мы, ламеры, этого не любим...
...по плагину md5
О, K.A.V. меня опередил.
То же самое хотел предложить. А, пусть остается! Что я, зря пыхтел ;)
Например, так...
!include "MUI2.nsh"
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW CheckFile
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
Caption "Check My Prog"
Name "My Prog"
OutFile "check-my-prog.exe"
InstallDir "$DESKTOP\TEST\"
RequestExecutionLevel admin
Section
SectionEnd
Function CheckFile
; Проверка версии файла:
StrCpy $0 "$INSTDIR\my-prog.exe"
md5dll::GetMD5File "$0"
Pop $R1
StrCpy $1 $R1
${If} $1 == b81255bd3b534b7453f285ffed22ae3b ; Если исходный файл - версия 1
MessageBox MB_OK "Найден исходный файл - версия 1" IDOK Done
${ElseIf} $1 == 304cd644be40cbb8d2a115aef6f2c5ec ; Если версия 2
MessageBox MB_OKCANCEL "Найдена программа версии 2. $\n$\n\
Чтобы продолжить, нажмите 'ОК' $\n\
Для выхода нажмите 'Отмена'" IDCANCEL Done
MessageBox MB_OK "Была нажата кнопка ОК." IDOK Done
${ElseIf} $1 == abaf0a548b8971d6185e291c800e516b ; Если версия 3
MessageBox MB_OK|MB_ICONSTOP| "Найдена программа версии 3." IDOK
${Else} ; Если нет совпадений
MessageBox MB_OK|MB_ICONSTOP| "В папке TEST нет нифига... $\n\
Нужно выбрать папку с номером" IDOK
Done:
Quit ; Прерывание работы (ВЫХОД) после нажатия кнопки ОК или Отмена.
${EndIf}
FunctionEnd
В архиве CheckMyProg.zip лежит сценарий и файлы для проверки работы. Исполняемые файлы в папках - TXT-файлы с измененными расширениями.
Обнаружилось следующее недоразумение :
Если скомпилировать скрипт, с bmp картинкой на кнопке, в Windows 7, то при запуске этого скомпилированного exe в Windows 10 - картинка на кнопке почему то отсутствует...
И наоборот - если скомпилировать скрипт с картинкой на кнопке, в Windows 10, то в Windows 7 картинки нет...
При компиляции и запуске скрипта в одноименных ОС - всё ОК.
пример :
OutFile "test.exe"
!include "MUI2.nsh"
Page Custom MyPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English
var dlg
var Button
Var IMAGE
Function .onInit
InitPluginsDir
File /ONAME=$PLUGINSDIR\nsis.bmp "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp"
FunctionEnd
Function MyPage
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateButton} 100u 20u 157 57 ''
Pop $Button
${NSD_OnClick} $Button ButtonClick
${NSD_AddStyle} $Button "${BS_BITMAP}"
System::Call 'user32::LoadImage(i 0, t "$PLUGINSDIR\nsis.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s'
Pop $IMAGE
SendMessage $Button ${BM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE
nsDialogs::Show
System::Call "gdi32::DeleteObject(i$IMAGE)"
FunctionEnd
Function ButtonClick
MessageBox MB_OK "ButtonClick"
FunctionEnd
Section
SectionEnd
Чтобы это значило ? ( Причём, с иконкой-картинкой на кнопке - всё ОК, т.е. обратно совместимо на всех ОС )
NSIS - 3.0b2
Обнаружилось следующее недоразумение :
Если скомпилировать скрипт, с bmp картинкой на кнопке, в Windows 7, то при запуске этого скомпилированного exe в Windows 10 - картинка на кнопке почему то отсутствует...
И наоборот - если скомпилировать скрипт с картинкой на кнопке, в Windows 10, то в Windows 7 картинки нет... »
Ничего подобного, у меня всё ок...Что у тебя за волшебство постоянно в разных системах - не знаю :)
Dodakaedr
25-08-2015, 21:12
Проблема с куском кода.
IfFileExists "$EXEDIR\cfg.cfg" ext dis
ext:
ReadINIStr $0 "$EXEDIR\cfg.cfg" "test" "Lang"
StrCmp $0 "Rus" 0 +3
ExecWait "$EXEDIR\MyProg Rus.exe"
goto next
StrCmp $0 "Eng" 0 +3
ExecWait "$EXEDIR\MyProg.exe"
goto next
MessageBox MB_OK "бла-бла"
quit
dis:
WriteINIStr "$EXEDIR\cfg.cfg" "test" "Lang" "Rus"
goto ext
next:
....
Правильно ли я сделал чтение значения параметра и сравнил их? Проблема в том, что не запускается MyProg Rus.exe, постоянно запускается MyProg.exe не зависимо от значения параметра.
P.S. Разобрался! Проблема была в названии программы.
Что у тебя за волшебство постоянно в разных системах »
Действительно чертовщина, но так ведь на самом деле происходит ! :) На вышеописанный момент я обратил внимание вчера, увидев аналогичный вопрос на винампе. Заинтересовался, проверил у себя - тоже самое !
А сегодня установил NSIS на свежий комп с семёркой, скомпилил скрипт - всё ОК и на этом компе и на компе с десяткой... Ну разве не чертовщина ? :)
Т.е. на моей рабочей семёрке что то не так (и у задавшего вопрос на винампе, наверное тоже самое...).
Проще переустановить систему, чем разобраться, что же произошло...
Dodakaedr
26-08-2015, 16:19
Как с помощью плагина winver2 сделать следующее:
Если версия ОС =>6.0, то выполнить одно действие а если меньше 6.0 то другое. Как создать такое условие?
Как с помощью плагина winver2 сделать следующее:
Если версия ОС =>6.0, то выполнить одно действие а если меньше 6.0 то другое. Как создать такое условие? »
Может, вы уже начнёте справочник читать?
Статьи => Логические конструкции
Примеры кодов => Умное сравнение версий файлов
Dodakaedr
26-08-2015, 17:00
K.A.V., Регистрация dll провожу через команду RegDLL, а дерегистрацию как сделать? Есть противоположная команда? В справке не нашел.
Begin2Fly
26-08-2015, 17:04
K.A.V., Регистрация dll провожу через команду RegDLL, а дерегистрацию как сделать? Есть противоположная команда? В справке не нашел. »
В шапке находится переведённое на русский язык руководство пользователя. Перевод – Поляков А.В, зеркало
Пункты 4.9.3.13, 4.9.3.14. Не ленитесь.
kotkovets
26-08-2015, 17:31
RegDLL, а дерегистрацию как сделать? Есть противоположная команда? »
unregdll
K.A.V., Регистрация dll провожу через команду RegDLL, а дерегистрацию как сделать? Есть противоположная команда? В справке не нашел. »
Кстати, RegDLL/UnRegDLL не работают в x64-системах, для корректной регистрации библиотеки в x64-системе, нужно вызывать regsvr32, все об этом знают?
Это было выявлено уже не помню как, либо здесь кто-то об этом говорил, либо мне кто-то репорт кидал, когда создаваемые SFX архивы через мой креатор не регистрировали dll, либо я сам это обнаружил :)
Возможно, этот баг уже исправили и всё наладили в новой сборке NSIS, пока не было времени тестировать (а может, моя личная dll написана криво, на которой тестил :biggrin:)
В любом случае, проверьте, регистрирует ли новая сборка NSIS библиотеки через эти команды, а если нет - пользуйтесь логической конструкцией, например, я буду пользоваться в своём SFX Creator таким кодом для регистрации библиотек:
Сохраняем в переменную $IsWow64Process тип системы (если значение 1 = 64 бита)
Function .onInit
Var /Global IsWow64Process
System::Call kernel32::GetCurrentProcess()i.s
System::Call kernel32::IsWow64Process(is,*i.s)
Pop $IsWow64Process
FunctionEnd
Для регистрации использовать так
${If} $IsWow64Process == "1"
ExecWait 'regsvr32 /s "$TEMP\MyDll.dll"'
${Else}
RegDLL "$TEMP\MyDll.dll"
${EndIf}
Для отмены регистрации использовать так
${If} $IsWow64Process == "1"
ExecWait 'regsvr32 /u /s "$TEMP\MyDll.dll"'
${Else}
UnRegDLL "$TEMP\MyDll.dll"
${EndIf}
Можно загнать всё в макросы для более удобного использования:
В начале кода:
!define MyRegDLL "!insertmacro MyRegDLL"
!macro MyRegDLL _FILE_
${If} $IsWow64Process == "1"
ExecWait 'regsvr32 /s "${_FILE_}"'
${Else}
RegDLL "${_FILE_}"
${EndIf}
!macroend
!define MyUnRegDLL "!insertmacro MyUnRegDLL"
!macro MyUnRegDLL _FILE_
${If} $IsWow64Process == "1"
ExecWait 'regsvr32 /u /s "${_FILE_}"'
${Else}
UnRegDLL "${_FILE_}"
${EndIf}
!macroend
Не забудьте получить тип системы:
Function .onInit
Var /Global IsWow64Process
System::Call kernel32::GetCurrentProcess()i.s
System::Call kernel32::IsWow64Process(is,*i.s)
Pop $IsWow64Process
FunctionEnd
Для регистрации использовать так
${MyRegDLL} "$TEMP\MyDll.dll"
Для отмены регистрации использовать так
${MyUnRegDLL} "$TEMP\MyDll.dll"
Не тестировал, но вроде всё правильно написал
Dodakaedr
26-08-2015, 20:24
Проблема с LogicLib.nsh. Не работает пример из справки OutFile "test.exe"
!include "Logiclib.nsh"
Section
StrCpy $0 "7"
${If} $0 => 5
MessageBox MB_OK "$0=>5"
${EndIf}
SectionEnd
http://i65.fastpic.ru/big/2015/0826/9d/170c228cf1db5028818ac2066f979b9d.jpg
Версия nsis 3.0a2. В чем может быть проблема?
Ответ (http://forum.oszone.net/post-2491709.html#post2491709)
Всем привет.
Есть задача, скорей всего нерешаемая, но всё-таки спрошу, может и есть какие-то варианты...
В общем веду неравный бой с торрентами. Дело в том, что мою программу выкладывают там, и авторы раздач зачастую сами не понимают какие версии грузят, т.к программа постоянно обновляется. Так вот хочу спросить, как прикрыть или ограничить подобную лавочку? Чтобы программу качали с официального сайта, а не с торрентов. Быть может реализовать одноразовые ключи и выдавать их только тем, кто загрузил программу с официального сайта. Но я не знаю как отладить такую схему... Есть ли у вас мнение насчёт этого вопроса?
Спасибо!
Дело в том, что мою программу выкладывают там, и авторы раздач зачастую сами не понимают какие версии грузят, т.к программа постоянно обновляется. Так вот хочу спросить, как прикрыть или ограничить подобную лавочку? »
Причем здесь NSIS, т.е. пакет инсталлятора? Ваша программа полностью на NSIS написана? Что помешает пользователю скопировать ключ с официального сайта и вставить в описание раздачи?
Запихните в главный файл проверку контрольных сумм файлов программы, чтобы все компоненты были нужной версии, если написана программа не на NSIS - сделайте эту проверку в отдельном потоке, чтобы сделать проверку незаметной для пользователя
Kopejkin
28-08-2015, 23:52
Подскажите, как нужно записать, чтобы папка с файлами устанавливалась на общем Рабочем столе, а не на пользовательском?
InstallDir "$DESKTOP\Моя программа"
Section
SetOutPath "$INSTDIR"
SetShellVarContext all
File /r "${pkgdir}\files\*"
SectionEnd
Так у меня получается установить только на пользовательский Раб.стол
как нужно записать, чтобы папка с файлами устанавливалась на общем Рабочем столе, а не на пользовательском? »
Function .onInit
SetShellVarContext all
StrCpy $INSTDIR "$DESKTOP\Моя программа"
FunctionEnd
Kopejkin
29-08-2015, 00:25
Function .onInit »
Шайтан, однако :wow: Спасибо!
K.A.V.
Здравствуйте.
Подскажите, пожалуйста, как на созданной странице сделать кликабельную ссылку (без всяких плагинов типа Linker).
Ну чтобы адрес сайта преобразовывался в кликабельный.
PS: страницу создал на NSIS Dialogs
---------------
как на созданной странице сделать кликабельную ссылку (без всяких плагинов типа Linker). »
Клик на Label-адресе. Открытие ссылки через Shell
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC