PDA

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


Страниц : 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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

sawe
21-07-2011, 17:37
Это кто вам такое сказал то? смысл здесь в чем? »

Справка от версии 1,68 до 2,10 и обзывается makensis.html

kotkovets
21-07-2011, 18:08
sawe, Я не знаю как в предыдущих версиях, может наследие...
Местные регистры - означает, что эти переменные работают, только в пределах одной секции или функции - потом значение этих переменных уничтожается (как и в компиляторах си, делфи)
глобальные значения - т.е эти переменые, значения можно использовать любой функцией или макросом в пределах установщика.
Однако все значения этих переменных использовать можно любой функцией или любым макросом.

sawe
21-07-2011, 22:21
Я не знаю как в предыдущих версиях, может наследие... »
До второй версии была даже поддержка Unix-ов, чем выгодно отличалась от других.

wolkow70
23-07-2011, 17:49
Уважаемый kotkovets, не подскажите по какой причине может не компилироваться такой макрос дерегистрации:


!macro UnRegisterExtension extenstion
Push $1
Push $2
StrCpy $ClassName "FastStone.${extenstion}"
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
StrCmp $1 "$ClassName" 0 RestoreProgid
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "PerceivedType"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Content Type"
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" "FastStone.bak"
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" $1
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "FastStone.bak"
;
RestoreProgid:
;
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" $2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"
;
Pop $1
Pop $2
!macroend

Ошибка вылазит такая:

StrCpy $ClassName "FastStone.TIFF" () ()
ReadRegStr $1 HKLM\SOFTWARE\Classes\.TIFF\
StrCmp "$1" "$ClassName" equal=0, nonequal=RestoreProgid
DeleteRegValue: HKLM\SOFTWARE\Classes\.TIFF\
DeleteRegValue: HKLM\SOFTWARE\Classes\.TIFF\PerceivedType
DeleteRegValue: HKLM\SOFTWARE\Classes\.TIFF\Content Type
DeleteRegKey: HKLM\SOFTWARE\Classes\$ClassName
ReadRegStr $1 HKLM\SOFTWARE\Classes\.TIFF\FastStone.bak
WriteRegStr: HKLM\SOFTWARE\Classes\.TIFF\=$1
DeleteRegValue: HKLM\SOFTWARE\Classes\.TIFF\FastStone.bak
Error: label "RestoreProgid:" already declared in section
Error in macro UnRegisterExtension on macroline 15
Error in script "D:\NSIS\FastStoneView.nsi" on line 769 -- aborting creation process

kotkovets
23-07-2011, 19:12
по какой причине может не компилироваться »
вы в одной секции, вызываете макрос несколько раз, получается вставка кода макроса в секцию и в макросе есть безусловный переход по метке - это противоречит синтаксису NSIS: совпадение безусловных переходов по имени не допускается! (Error: label "RestoreProgid:" already declared in section)
Здесь нужно применять условные переходы или логическую конструкцию.
!include logiclib.nsh
--
--
StrCpy $ClassName "FastStone.${extenstion}"
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
${If} $1 == "$ClassName"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "PerceivedType"
---
---
${Else}
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" $2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"
${EndIf}
---
---

wolkow70
23-07-2011, 19:37
Спасибо за ответ. Пока я его ждал, еще попробовал сделать так:

!macro UnRegisterExtension extenstion
Push $1
Push $2
StrCpy $ClassName "FastStone.${extenstion}"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
StrCmp $1 "$ClassName" 0 +2
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
;
StrCmp $1 "$ClassName" 0 +3
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "PerceivedType"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Content Type"
;
StrCmp $1 "$ClassName" 0 +2
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
;
StrCmp $1 "$ClassName" 0 +4
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" "FastStone.bak"
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" $1
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "FastStone.bak"
;
;;RestoreProgid
;
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid" $2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "FastStone.bak"
;
Pop $1
Pop $2
!macroend

В таком виде тоже все работает.

И все таки не понятно почему безусловные переходы совпадают?
Ведь дерегистрация каждого расширения вызывается отдельной коммандой:
!insertmacro UnRegisterExtension "WMF"
!insertmacro UnRegisterExtension "TIFF"
!insertmacro UnRegisterExtension "TIF"
!insertmacro UnRegisterExtension "TGA"
Я так понимаю, что макрос каждый раз запускается снова для выполнения комманд, или во что-то не врубился?

kotkovets
23-07-2011, 19:45
В таком виде тоже все работает »
здесь уже условные переходы, отсчет идет относительно оператора сравнения, но это очень не удобно - при каждом изменении макроса приходится подсчитывать переходы, что бы условия переходов соблюдались
И все таки не понятно почему безусловные переходы совпадают? »
потому что, компилятор код макроса "вставляет" в секцию, из которой вызывается макрос.
Я так понимаю, что макрос каждый раз запускается снова для выполнения комманд, или во что-то не врубился? »
конечно!

wolkow70
23-07-2011, 20:09
потому что, компилятор код макроса "вставляет" в секцию, из которой вызывается макрос. »
Вот это я и не учел. Но, я ориентировался на пример из справки:
http://nsis.sourceforge.net/File_Association

!macro UnRegisterExtension_
!verbose push
!verbose ${_FileAssociation_VERBOSE}

Exch $R1 ;desc
Exch
Exch $R0 ;ext
Exch
Push $0
Push $1

ReadRegStr $1 HKCR $R0 ""
StrCmp $1 $R1 0 NoOwn ; only do this if we own it
ReadRegStr $1 HKCR $R0 "backup_val"
StrCmp $1 "" 0 Restore ; if backup="" then delete the whole key
DeleteRegKey HKCR $R0
Goto NoOwn

Restore:
WriteRegStr HKCR $R0 "" $1
DeleteRegValue HKCR $R0 "backup_val"
DeleteRegKey HKCR $R1 ;Delete key with association name settings

NoOwn:

Pop $1
Pop $0
Pop $R1
Pop $R0

!verbose pop
!macroend

Который почему-то работает. Наверное, он вызывается по другому.

kotkovets
23-07-2011, 20:38
Который почему-то работает. Наверное, он вызывается по другому. »
Вызывается макрос через ${CallArtificialFunction} RegisterExtension_, ${CallArtificialFunction} - описан в хедере Util.nsh. Офигительный хедер, очень помогает, особенно в циклах.
Вот вы попробуйе в FileAssociation.nsh заменить ${CallArtificialFunction} на !insertmacro и вы получите конфликт по именам переходов

wolkow70
24-07-2011, 09:21
Вызывается макрос через ${CallArtificialFunction} RegisterExtension_, ${CallArtificialFunction} - описан в хедере Util.nsh. Офигительный хедер, очень помогает, особенно в циклах. »

В оригинальном скрипте VLC нет FileAssociation.nsh и нет комманды ${CallArtificialFunction} RegisterExtension_, мне вообще не понятно как он работает, а ведь работает (проверял неоднократно)...

kotkovets
24-07-2011, 10:32
мне вообще не понятно как он работает, а ведь работает »
через функцию, точно также как делает ${CallArtificialFunction},
!macro RegisterExtensionSection EXT
Section ${EXT}
SectionIn 1 3
Push $R0
StrCpy $R0 ${EXT}
Call RegisterExtension
Pop $R0
SectionEnd
!macroend

wolkow70
24-07-2011, 11:22
через функцию, точно также как делает ${CallArtificialFunction}, »

Мне понятно, что через функцию. Но, ведь, функция вызывается из секции, а как для каждого расширения подставляется новая секция не понятно.

kotkovets
24-07-2011, 11:40
wolkow70,
Call - значит вызов функции на исполнение и не больше!

wolkow70
24-07-2011, 11:55
Товарищи, подскажите как при удалении удалить программу из "открыть с помощью"
Пробовал так, не получается:

ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" ""
StrCmp $2 "FSViewer.exe" 0 +2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" ""

kotkovets
24-07-2011, 12:32
wolkow70, Вы сначала выясните, что помещается в $2, а удаляться будет значение ключа по умолчанию, только если $2 = FSViewer.exe, иначе нет!
смотрите значение параметра а
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "a"

wolkow70
24-07-2011, 13:01
смотрите значение параметра а
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "a" »

У каждого расширения FSViewer.exe имеет разные значения, в большинстве случаев не "a"

kotkovets
24-07-2011, 14:31
wolkow70, только через перечисление значений ключей реестра, в этом здорово поможет мой макрос
http://forum.oszone.net/showpost.php?p=1658900
задаете маску удаления значений FSViewer.exe
${DelRegValue} HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "FSViewer.exe"
Кстати я уже намного расширил возможности своей библиотеки и избавил от применения плагина, полностью переписал на WIN API, готовлю описание к справочнику.

sawe
24-07-2011, 16:52
полностью переписал на WIN API »
Вещь конечно очень нужная, но недавно читал на форумах для программистов и тестеров, как они мучаются с WIN API для новой Windows 8. Как они объясняют в новой Windows 8 появится много новых API функций и часть прежних не будут поддерживаться. Если их количество перейдёт в новое качество, то тогда закат NSIS гарантирован.

kotkovets
24-07-2011, 17:12
Если их количество перейдёт в новое качество, то тогда закат NSIS гарантирован. »
Волков боятся - в лес не ходить. Главное, чтобы на msdn library (http://msdn.microsoft.com/en-us/library/ms123401.aspx) было подробное описание прототипов функций, оно будет! и переделать дело техники.

wolkow70
25-07-2011, 13:38
${DelRegValue} HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithList" "FSViewer.exe" »
Не работает так.

!include "DelRegKey.nsh"

Ошибка:

!insertmacro: _DelRegValue
Push: FSViewer.exe
Push: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.WMF\OpenWithList
Push: HKCU
Exch($7,0)
Exch(st(1),0)
Exch($1,0)
Exch(st(2),0)
Exch($5,0)
StrLen $6 "$5"
Push: $8
Exch($8,0)
StrCpy $8 "0" () ()
!insertmacro: CallArtificialFunction
!define: "CallArtificialFunction_TYPE"="uninst"
Call ":._DeleteRegValueuninst"
Goto: _DeleteRegValueuninst_DONE
!define: "_DeleteRegValueuninst_DEFINED"=""
!insertmacro: _DeleteRegValue
Invalid command: registry::_Open
Error in macro _DeleteRegValue on macroline 1
Error in macro CallArtificialFunction on macroline 11
Error in macro _DelRegValue on macroline 13
Error in macro UnRegisterExtension on macroline 37
Error in script "D:\NSIS\FastStoneView.nsi" on line 734 -- aborting creation process




© OSzone.net 2001-2012