Показать полную графическую версию : [архив].: NSIS - все вопросы :.
wolkow70
18-04-2012, 16:28
Берёте прописываете свою команду на запись в реестр и сохраняете значение этой переменной во время установки: »
Я знаю , что так можно сделать, я не пойму зачем это делать, когда MUI2 сам должен это уметь.
Вот же там есть:
!macro MUI_STARTMENU_GETFOLDER ID VAR
!verbose push
!verbose ${MUI_VERBOSE}
;Get Start Menu folder from registry
;Can be called from the script in the uninstaller
!ifdef MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT & MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY & MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME
ReadRegStr $mui.StartMenuPage.RegistryLocation "${MUI_STARTMENUPAGE_${ID}_REGISTRY_ROOT}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_KEY}" "${MUI_STARTMENUPAGE_${ID}_REGISTRY_VALUENAME}"
${if} $mui.StartMenuPage.RegistryLocation != ""
StrCpy "${VAR}" $mui.StartMenuPage.RegistryLocation
${else}
StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}"
${endif}
!else
StrCpy "${VAR}" "${MUI_STARTMENUPAGE_${ID}_DEFAULTFOLDER}"
!endif
!verbose pop
!macroend
wolkow70, у вас
!define MUI_STARTMENUPAGE_DEFAULTFOLDER
прописано? (может пустое значение пишет в реестр?)
Значение записывается вообще в реестр или нет?? Вы проверяли?
Где именно ошибка, может даже и запись в реестр не происходит, а мы тут читать пытаемся :drug:
wolkow70
18-04-2012, 16:40
Вот как прописано:
Var MENU
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${pkgdir}\USB Safely Remove\License.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_STARTMENU Application $MENU
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
Section "Создать группу ярлыков в меню Пуск" StartMenu
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\$MENU"
CreateShortCut "$SMPROGRAMS\$MENU\${PRODUCT_NAME}.lnk" "$INSTDIR\USBSafelyRemove.exe"
CreateShortCut "$SMPROGRAMS\$MENU\Справка ${PRODUCT_NAME}.lnk" "$INSTDIR\USBSafelyRemoveRu.chm"
CreateShortCut "$SMPROGRAMS\$MENU\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\uninstall.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd
В деинсталляторе:
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $MENU
SetShellVarContext all
RMDir /r "$SMPROGRAMS\$MENU"
Var MENU
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${pkgdir}\USB Safely Remove\License.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_STARTMENU Application $MENU
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH »
....
Вы мне скажите, у вас значение записывает в реестр?? Сами откройте редактор реестра и посмотрите!
На рабочем столе папка создаётся с именем в меню пуск??
У меня код рабочий...
Попробуйте вот так написать...
Var MENU
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Моя программа"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${pkgdir}\USB Safely Remove\License.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_STARTMENU Application $MENU
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
у меня кстати MUI подключается, а не MUI2, может из-за этого работает, не знаю
wolkow70
18-04-2012, 16:44
Да, прописывается в реестр
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu2\Programs\Утилиты\USB Safely Remove]
"Order"=hex:08(большое значение).
"Order"=hex:08(большое значение). »
Что-то у вас не сходится...
Записывается в реестр как будто это тип ключа REB_BINARY или REG_EXPAND_SZ
По умолчанию должно прописывать в:
Software\Microsoft\Windows\CurrentVersion\Uninstall
Смотрите значит ваш код, вы видно сами там что-то прописывали
wolkow70
18-04-2012, 17:03
В Software\Microsoft\Windows\CurrentVersion\Uninstall создается запись деинсталляции
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\USB Safely Remove (но там пути создания ярлыков нет, только то, что прописано в секции создания деинсталлятора.).
Еще заметил, если создавать ярлыки в самом StartMenu, то стало удаляться, а если поместить в подгруппу "Утилиты" , то не удаляется. Значит $MENU не пустое.
wolkow70, пропишите в скрипт запись значения $MENU при установке и при вызове деинсталлятора во внешний файл, чтобы понять, что у вас там назначается этой переменной...
wolkow70
18-04-2012, 17:21
Сделал так:
Section Uninstall
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $MENU
MessageBox MB_OK "$MENU" IDOK
SetShellVarContext all
RMDir /r "$SMPROGRAMS\$MENU"
Пробовал ставить непосредственно в "Программы" - мессадж - в "$MENU" USB Safely Remove (при этом все нормально удаляется).
Ставлю в "Программы\Утилиты" - мессадж - тоже в "$MENU" USB Safely Remove (но при этом не удяляется). То есть, полный путь (относительно "Программы") не прописывается в "$MENU". Только сама папка.
Еще сделал проверку при установке:
Section "Создать группу ярлыков в меню Пуск" StartMenu
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
MessageBox MB_OK "$MENU" IDOK
;
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\$MENU"
Все нормально в мессаджах записывается.
В первом случае:
USB Safely Remove
Во втором случае:
Утилиты\USB Safely Remove
kotkovets
18-04-2012, 17:48
kotkovets, внеси в шапку ссылку на плагины, либо я её не вижу, либо её там реально нет »
внес в: Расширение функциональности -> Плагины и полезности к NSIS
wolkow70, классический пример:
!include "MUI2.nsh"
Name "Modern UI Test"
OutFile "StartMenu.exe"
InstallDir "$EXEDIR\Modern UI Test"
Var StartMenuFolder
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Modern UI Test"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Section "Dummy Section"
SetOutPath "$INSTDIR"
WriteUninstaller "$INSTDIR\Uninstall.exe"
SetShellVarContext all
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
!insertmacro MUI_STARTMENU_WRITE_END
SectionEnd
Section "Uninstall"
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder
SetShellVarContext all
MessageBox MB_OK "$SMPROGRAMS\$StartMenuFolder" IDOK
DeleteRegKey HKCU "Software\Modern UI Test"
Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk"
RMDir /r "$SMPROGRAMS\$StartMenuFolder"
RMDir /r "$INSTDIR"
SectionEnd
wolkow70
18-04-2012, 18:01
kotkovets,
Ваш пример сработал на 100%.
В вашем примере в реестре специально создается параметр для хранения значения переменной.
С такими строками у меня тоже все заработало.
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\SafelyRemove"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
Только я подозреваю, что макросы MUI2 сами это должны делать, используя специальные значения реестра Windows. Не должно быть так, чтобы специально их прописывать.
wolkow70
23-04-2012, 13:52
Товарищи, подскажите по такому вопросу:
Process Monitor показывает выполнение :
rundll32.exe aimp_menu32.dll,ContextMenuAddonRegister
Делаю cmd файл в папке с aimp_menu32.dll
rundll32.exe aimp_menu32.dll,ContextMenuAddonRegister
При этом все работает.
В скрипте NSIS пишу :
ExecWait '"rundll32.exe $INSTDIR\Modules\aimp_menu32.dll,ContextMenuAddonRegister"'
Комманда не работает.
ExecWait '"rundll32.exe $INSTDIR\Modules\aimp_menu32.dll,ContextMenuAddonRegister"' »
попробуйте в кавычки заключить начиная не с места перед rundll32, а перед переменной $INSTDIR
kotkovets
23-04-2012, 16:07
wolkow70, а вы маньяк, по тысячу раз на одни и те же грабли наступать...:)
http://forum.oszone.net/post-1821953-2142.html
или как то так...
ExecWait 'rundll32.exe "$INSTDIR\Modules\aimp_menu32.dll", ContextMenuAddonRegister' $0
MessageBox MB_OK "$0"
По идее, если все нормально, то $0 обычно равен нулю, т.е смотреть, что возвращает rundll32 при успехе.
wolkow70
23-04-2012, 16:17
попробуйте в кавычки заключить начиная не с места перед rundll32, а перед переменной $INSTDIR »
Сделал так:
ExecWait 'rundll32.exe "$INSTDIR\Modules\aimp_menu32.dll,ContextMenuAddonRegister"'
Process Monitor показывает выполнение :
rundll32.exe "E:\Program Files\AIMP3\Modules\aimp_menu32.dll,ContextMenuAddonRegister"
Но при этом регистрации библиотеки не происходит.
В то время как батником регистрируется. Видимо дело в длинном пути к файлу.
wolkow70, а вы маньяк, по тысячу раз на одни и те же грабли наступать...
http://forum.oszone.net/post-1821953-2142.html »
Этот способ я знаю и у меня ранее в скрипте так и было
RegDLL "$INSTDIR\Modules\aimp_menu32.dll" ContextMenuAddonRegister.
Но, при оригинальной инсталляции процесс регистрации происходит не через рег-сервер, а через выполнение rundll32.exe aimp_menu32.dll,ContextMenuAddonRegister
В чем отличие затрудняюсь прокомментировать.
В то время как батником регистрируется. Видимо дело в длинном пути к файлу. »
Попробуйте указать путь к rundll32, т.е. $SYSDIR\rundll32.exe
kotkovets
23-04-2012, 16:27
Этот способ я знаю и у меня ранее так и было. Но при оригинальной инсталляции процесс регистрации происходит не через рег-сервер, а через выполнение rundll32.exe aimp_menu32.dll,ContextMenuAddonRegister
В чем отличие затрудняюсь прокомментировать. »
Это тоже самая регистрация, но точка входа нестандартная(ContextMenuAddonRegister)
В предыдущем сообщении, у меня все отработало в двух вариантах на 100%,
ЧИТАЙТЕ ВНИМАТЕЛЬНО, что вам пишут!!!
wolkow70
23-04-2012, 16:36
Сделал так:
ExecWait 'rundll32.exe "$INSTDIR\Modules\aimp_menu32.dll",ContextMenuAddonRegister' $0
MessageBox MB_OK "$0"
Возврат 0
Все зарегистрировалось. Всем спасибо.
Вот еще обратил внимание, что при оригинальной деинсталляции AIMP aimp_menu32.dll как то тихо удаляется без всякой перезагрузки и перезапуска эксплорера. Вот бы также сделать.
wolkow70
24-04-2012, 11:21
kotkovets,
Возник ряд вопросов по логическим конструкциям, может подскажите:
1. Возможно ли использовать логическую конструкцию в составе макроса с подставляемой переменной?
2. Возможно ли при этом сравнивать не только числовые, но и иные значения хранящиеся в переменных?
3. Возможно ли совпадение условию использовать для исключения выполнения комманды по отношению к условию Else?
Пример к вопросу - фрагмент макроса:
Var ClassName
!macro UnRegisterExtension extenstion
StrCpy $ClassName "AIMP.${extenstion}"
;
; тут разное
;
${If} ${AtLeastWinVista}
ReadRegStr $7 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid"
ReadRegStr $8 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "AIMP.Backup"
${If} $7 == "$ClassName"
${OrIf} $7 == "Applications\AIMP3.exe"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
${If} $8 == ""
${OrIf} $8 == "$ClassName"
${OrIf} $8 == "Applications\AIMP3.exe"
${Else}
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$8"
${EndIf}
${EndIf}
${EndIf}
!macroend
kotkovets
24-04-2012, 12:32
1. Возможно ли использовать логическую конструкцию в составе макроса с подставляемой переменной? »
конечно.
Возможно ли при этом сравнивать не только числовые, но и иные значения хранящиеся в переменных? »
${OrIf} $7 == "Applications\AIMP3.exe" »
так вы здесь, не числа то, сравниваете.Возможно ли совпадение условию использовать для исключения выполнения комманды по отношению к условию Else? »
А, что обязательно включать, конструкцию ${Else} включать, вовсе нет!
${IfNot} $8 == ""
${OrIfNot} $8 == "$ClassName"
${OrIfNot} $8 == "Applications\AIMP3.exe"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$8"
${EndIf}
И здесь постановка условия ИЛИ, т.е всегда будет срабатывать, если одно из условий сработает.
условие И, сработает, если $8 не равно пустому значению и не равно $ClassName и не равно Applications\AIMP3.exe:
${IfNot} $8 == ""
${AndIfNot} $8 == "$ClassName"
${AndIfNot} $8 == "Applications\AIMP3.exe"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$8"
${EndIf}
wolkow70, сколько раз говорил, код в тег заключать(выделяем код, жмем кнопочку #), противно читать...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC