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

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-файлы с измененными расширениями.

MKN
25-08-2015, 17:27
Обнаружилось следующее недоразумение :
Если скомпилировать скрипт, с 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

K.A.V.
25-08-2015, 18:41
Обнаружилось следующее недоразумение :
Если скомпилировать скрипт, с 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. Разобрался! Проблема была в названии программы.

MKN
26-08-2015, 10:45
Что у тебя за волшебство постоянно в разных системах »
Действительно чертовщина, но так ведь на самом деле происходит ! :) На вышеописанный момент я обратил внимание вчера, увидев аналогичный вопрос на винампе. Заинтересовался, проверил у себя - тоже самое !
А сегодня установил NSIS на свежий комп с семёркой, скомпилил скрипт - всё ОК и на этом компе и на компе с десяткой... Ну разве не чертовщина ? :)
Т.е. на моей рабочей семёрке что то не так (и у задавшего вопрос на винампе, наверное тоже самое...).
Проще переустановить систему, чем разобраться, что же произошло...

Dodakaedr
26-08-2015, 16:19
Как с помощью плагина winver2 сделать следующее:
Если версия ОС =>6.0, то выполнить одно действие а если меньше 6.0 то другое. Как создать такое условие?

K.A.V.
26-08-2015, 16:34
Как с помощью плагина 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.
26-08-2015, 19:19
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. В чем может быть проблема?

K.A.V.
26-08-2015, 20:38
Ответ (http://forum.oszone.net/post-2491709.html#post2491709)

Serg866
27-08-2015, 08:57
Всем привет.
Есть задача, скорей всего нерешаемая, но всё-таки спрошу, может и есть какие-то варианты...

В общем веду неравный бой с торрентами. Дело в том, что мою программу выкладывают там, и авторы раздач зачастую сами не понимают какие версии грузят, т.к программа постоянно обновляется. Так вот хочу спросить, как прикрыть или ограничить подобную лавочку? Чтобы программу качали с официального сайта, а не с торрентов. Быть может реализовать одноразовые ключи и выдавать их только тем, кто загрузил программу с официального сайта. Но я не знаю как отладить такую схему... Есть ли у вас мнение насчёт этого вопроса?
Спасибо!

K.A.V.
27-08-2015, 14:07
Дело в том, что мою программу выкладывают там, и авторы раздач зачастую сами не понимают какие версии грузят, т.к программа постоянно обновляется. Так вот хочу спросить, как прикрыть или ограничить подобную лавочку? »
Причем здесь NSIS, т.е. пакет инсталлятора? Ваша программа полностью на NSIS написана? Что помешает пользователю скопировать ключ с официального сайта и вставить в описание раздачи?
Запихните в главный файл проверку контрольных сумм файлов программы, чтобы все компоненты были нужной версии, если написана программа не на NSIS - сделайте эту проверку в отдельном потоке, чтобы сделать проверку незаметной для пользователя

Kopejkin
28-08-2015, 23:52
Подскажите, как нужно записать, чтобы папка с файлами устанавливалась на общем Рабочем столе, а не на пользовательском?


InstallDir "$DESKTOP\Моя программа"

Section
SetOutPath "$INSTDIR"
SetShellVarContext all
File /r "${pkgdir}\files\*"
SectionEnd


Так у меня получается установить только на пользовательский Раб.стол

K.A.V.
29-08-2015, 00:05
как нужно записать, чтобы папка с файлами устанавливалась на общем Рабочем столе, а не на пользовательском? »
Function .onInit
SetShellVarContext all
StrCpy $INSTDIR "$DESKTOP\Моя программа"
FunctionEnd

Kopejkin
29-08-2015, 00:25
Function .onInit »

Шайтан, однако :wow: Спасибо!

Serg866
29-08-2015, 08:30
K.A.V.
Здравствуйте.
Подскажите, пожалуйста, как на созданной странице сделать кликабельную ссылку (без всяких плагинов типа Linker).
Ну чтобы адрес сайта преобразовывался в кликабельный.
PS: страницу создал на NSIS Dialogs
---------------

MKN
29-08-2015, 09:45
как на созданной странице сделать кликабельную ссылку (без всяких плагинов типа Linker). »
Клик на Label-адресе. Открытие ссылки через Shell




© OSzone.net 2001-2012