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

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

K.A.V.
18-04-2012, 16:34
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"

K.A.V.
18-04-2012, 16:44
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(большое значение).

K.A.V.
18-04-2012, 16:54
"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 не пустое.

K.A.V.
18-04-2012, 17:12
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"'

Комманда не работает.

K.A.V.
23-04-2012, 14:48
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
В чем отличие затрудняюсь прокомментировать.

K.A.V.
23-04-2012, 16:25
В то время как батником регистрируется. Видимо дело в длинном пути к файлу. »
Попробуйте указать путь к 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