Показать полную графическую версию : [архив].: NSIS - все вопросы :.
Это кто вам такое сказал то? смысл здесь в чем? »
Справка от версии 1,68 до 2,10 и обзывается makensis.html
kotkovets
21-07-2011, 18:08
sawe, Я не знаю как в предыдущих версиях, может наследие...
Местные регистры - означает, что эти переменные работают, только в пределах одной секции или функции - потом значение этих переменных уничтожается (как и в компиляторах си, делфи)
глобальные значения - т.е эти переменые, значения можно использовать любой функцией или макросом в пределах установщика.
Однако все значения этих переменных использовать можно любой функцией или любым макросом.
Я не знаю как в предыдущих версиях, может наследие... »
До второй версии была даже поддержка 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, готовлю описание к справочнику.
полностью переписал на 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC