Показать полную графическую версию : [архив].: NSIS - все вопросы :.
kotkovets, теперь такая проблемка, не знаю даже возможно ли её исправить...
есть такие записи
WriteRegStr HKLM "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP2: ShellExt"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "C:\PROGRA~1\AIMP2\System\AIMP_S~1.DLL"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"
WriteRegStr HKLM "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
они отвечают за такое
http://s013.radikal.ru/i324/1112/4b/6d9ff894c28f.jpg
Но это действует только в х86, а на х64 даже при установке с оригинального инсталлятора такого контекста нет...
Как это моно поправь, и возможно ли вообще?
И еще как проверить не установлена ли программа в системе при запуске инсталятора???
kotkovets
25-12-2011, 13:33
diakov,
Вам нужно регистрировать библиотеку aimp_shell.dll, а не ламерские и глупые сообщения разводить...
Regdll "путь к aimp_shell.dll"
и разрегистрация:
UnRegdll "путь к aimp_shell.dll"
Для контекстного меню AIMP3 есть файлики:
aimp_menu32.dll
aimp_menu64.dll
Эти файлики регистрируются, так:
regdll "$INSTDIR\Modules\aimp_menu32.dll" ContextMenuAddonRegister
разрегистрация:
regdll "$INSTDIR\Modules\aimp_menu32.dll" ContextMenuAddonUnregister
И еще как проверить не установлена ли программа в системе при запуске инсталятора??? »
Проверяйте путь, куда устанавливали программу - IfFileExists
--
Книжки читайте, там все расписано.
Если что извините за торможение я просто еще учусь....
kotkovets
25-12-2011, 14:28
diakov, Не нужно извиняться, просто почитайте, поэкспериментируйте, а затем пишите,
а то не гоже - тот час писать, не получается, толком не разобравшись.
да не тот час, если есть предположения то я экспериментирую, а если нет то спаршиваю...
з регистрацией и ассоциацией сидел часа 4 глаза с ночи красные как у быка! Но разобрался :ok:
wolkow70
25-12-2011, 15:48
diakov,
IfFileExists "$PROGRAMFILES\AIMP3\AIMP3.exe" 0 CheckProfiles
Goto CheckComplete
;
CheckProfiles:
IfFileExists "$APPDATA\AIMP3\AIMP3.INI" 0 CheckComplete
;
CheckComplete:
MessageBox MB_ICONINFORMATION|MB_OK "AIMP3 уже установлен, или на вашем компьютере есть настройки этого приложения. Данный инсталлятор не может быть использован поверх AIMP3"
Abort
Это обязательное требование автора программы для участников этого форума.
wolkow70, а если пользователь установил прогу не в $PROGRAMFILES а AIMP3.INI нет тода как?
kotkovets
25-12-2011, 16:58
wolkow70,
Совершенно неверная логика, которая всегда приведет к сообщению, что AIMP3 установлен!
А Вот так правильна, логика ИЛИ
${If} ${FileExists} "$PROGRAMFILES\AIMP3\AIMP3.exe"
${OrIf} ${FileExists} "$APPDATA\AIMP3\AIMP3.INI"
${OrIf} ${FileExists} "$INSTDIR\AIMP3\AIMP3.INI"
MessageBox MB_ICONINFORMATION|MB_OK "AIMP3 уже установлен, или на вашем компьютере есть настройки этого приложения. Данный инсталлятор не может быть использован поверх AIMP3"
Abort
${EndIf}
Путь можно из реестра получать, например, при регистрации библиотеки оболочки,
можно получить путь к dll, т.е папку установленной программы, затем проверяем наличие выше указанных файлов.
wolkow70
25-12-2011, 17:50
wolkow70, а если пользователь установил прогу не в $PROGRAMFILES а AIMP3.INI нет тода как? »
Это требование автора, а не мое. Видимо его беспокоит только стандартная установка.
wolkow70,
Совершенно неверная логика »
Это не я придумал, а выдернул из скрипта, который тут на форуме выложен.
Там так:
Function .onInit
--бла-бла--
;Выполняем требования автора проекта.
StrCpy $Violation 0
;
IfFileExists "$PROGRAMFILES\AIMP3\AIMP3.exe" 0 CheckProfiles
StrCpy $Violation 1
Goto CheckComplete
;
CheckProfiles:
IfFileExists "$APPDATA\AIMP3\AIMP3.INI" 0 CheckComplete
;
StrCpy $Violation 1
;
CheckComplete:
StrCmp $Violation 1 0 +4
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "AIMP3 уже установлен, или на вашем компьютере есть настройки этого приложения. Данный инсталлятор не может быть использован поверх AIMP3"
Abort
EndFunc:
FunctionEnd
kotkovets, подскажи, ато счас криша поедет :help:
такой код для IcoFX2 отлично работает и на ссклинер такой ставил тоже работает и с /S /inst и с /S /port
Function .onInit
InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
ClearErrors
${GetOptions} "$CMDLINE" "/port" $R0
${If} ${Silent} ;если тихий режим
${IfNot} ${Errors}
SetOutPath "$EXEDIR\IcoFX2Portable"
File /r "D:\IcoFX\IcoFX 2.0\*.*"
CreateDirectory "$APPDATA\IcoFX2"
SetOutPath "$APPDATA\IcoFX2"
File /r "D:\IcoFX\IcoFX2\*.*"
;тут пишем все команды при распаковки портативной версии
;здесь будет код выполняться с ключом /port в тихом режиме
StrCpy $Radio1 1 ;распаковка портативной версии
StrCpy $Radio 0 ;запрет установки в обычном режиме
${Else}
${GetOptions} "$CMDLINE" "/inst" $R0
SetOutPath "$INSTDIR"
StrCpy $Radio1 0 ;запрет портативной версии
StrCpy $Radio 1 ;установка в обычном режиме
StrCpy $Check2 1
StrCpy $Check 1
StrCpy $Check1 1
MessageBox MB_OK "${PRODUCT_NAME} ${PRODUCT_VERSION} установлена в тихом режиме."
ClearErrors
${EndIf}
${EndIf}
FunctionEnd
и такой же только для аимпа не работает :durak:
Function .onInit
InitPluginsDir ;иницилизируем рабочую папку, куда будут распакованы картинки
File "/oname=$PLUGINSDIR\nsis-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\nsis-r.bmp"
File "/oname=$PLUGINSDIR\orange-r.bmp" "${NSISDIR}\Contrib\Graphics\Header\orange-r.bmp"
ClearErrors
${GetOptions} "$CMDLINE" "/port" $R0
${If} ${Silent} ;если тихий режим
${IfNot} ${Errors}
SetOutPath "$EXEDIR\AIMPPortable"
File /r "D:\Aimp\AIMP2\*.*"
;тут пишем все команды при распаковки портативной версии
;здесь будет код выполняться с ключом /port в тихом режиме
StrCpy $Radio1 1 ;распаковка портативной версии
StrCpy $Radio 0 ;запрет установки в обычном режиме
StrCpy $Check3 1
${Else}
${GetOptions} "$CMDLINE" "/inst" $R0
SetOutPath "$INSTDIR"
StrCpy $Radio1 0 ;запрет портативной версии
StrCpy $Radio 1 ;установка в обычном режиме
StrCpy $Check2 1
StrCpy $Check 1
StrCpy $Check1 1
StrCpy $Check3 1
MessageBox MB_OK "${PRODUCT_NAME} ${PRODUCT_VERSION} установлена в тихом режиме."
ClearErrors
${EndIf}
${EndIf}
FunctionEnd
Просто мелькает черное кошко командной строки и все..
Как так?????????????
wolkow70
25-12-2011, 17:58
Путь можно из реестра получать, например, при регистрации библиотеки оболочки,
можно получить путь к dll, т.е папку установленной программы, затем проверяем наличие выше указанных файлов. »
А зачем жизнь усложнять. Автор требует проверять стандартные пути.
Все разобрался...оказывается у меня имя екзешника AIMP-3.0.0.970 RC3.exe переименовал его на AIMP-3.0.0.970.exe
и все заработало)
kotkovets
25-12-2011, 18:23
diakov, Сколько можно а...вы прикалываетесь или мегамоск спать хочет?
ЕСЛИ, $Radio1 = 1 ---> распаковка портативной версии
Какого? в функции .onInit писать распаковку, если распаковываться будет из секции, дважды распаковка O_o
уберите
SetOutPath "$EXEDIR\AIMPPortable"
File /r "D:\Aimp\AIMP2\*.*"
Просто возьмите в портабле в вместо выше кода, пишите, принудительно установите значение $INSTDIR:
StrCpy "$INSTDIR" "$EXEDIR\AIMPPortable"
Читайте книжки, в оригинальной справке введите, поиск по индексу: GetOptions
${GetOptions} "$CMDLINE" "/inst" $R0 - уберите это зло :)
Зачем вам куча ключей, когда вам достаточно ключа (/port) портативной установки в тихом режиме
Нет ключа этого в тихом режиме - обычная установка в тихом режиме.
Че тебе старче надо то еще??? :biggrin:
wolkow70
25-12-2011, 18:30
diakov,
Вы не обращали внимание, что оригинальный инсталлятор ставит ассоциации в HKCU, и там же прописывает $ClassName?
Затупил согласен) ${GetOptions} "$CMDLINE" "/inst" $R0 » ну это же не ошибка? просто я хочу два ключа порт - портативка а инст - иснталяция)
Вы не обращали внимание, что оригинальный инсталлятор ставит ассоциации в HKCU, и там же прописывает $ClassName? »
Это Вы к чему?
kotkovets
25-12-2011, 18:51
ну это же не ошибка? просто я хочу два ключа порт - портативка а инст - иснталяция) »
Не ошибка, зачем усложнять код, который вы до конца не понимаете???
А что будет, если создать поддержку ключа /inst, запустив установщик с ключом /S ???
А будет, тоже самое, что с ключом /inst !, отсюда вывод -
не нужно усложнять сложное - себе же мозг выносить, причем понапрасну :yes:
wolkow70
25-12-2011, 19:15
Это Вы к чему? »
К тому, что это неправильно. Но, иногда нужно подстраиваться под поведение программы для дальнейшего с ней взаимодействия.
Себе я сборку собрал уже. Все работает. Проблему наблюдаю только с регистрацией библиотеки
RegDLL "$INSTDIR\Modules\aimp_menu32.dll"
Впрочем проблема наблюдается и при использовании коммандной строки и программы RegDlllview? Ну не хочет она ни регистрироваться ни де-регистрироваться, хотя через саму программу запросто.
wolkow70, не знаю как у Вас но меня после установки AIMP 3.00 Build 970 RC 3 вообще никаких ассоциаций с медиа файлами не было
только эти строки появились
WriteRegStr HKLM "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP2: ShellExt"
WriteRegStr HKLM "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMPClassic" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "$INSTDIR\System\aimp_shell.dll"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"
а я уже настроил по своему....плюс подключил библиотеку иконок и привязал к аудио Black Style.dll
kotkovets
25-12-2011, 19:27
Себе я сборку собрал уже. Все работает. Проблему наблюдаю только с регистрацией библиотеки
RegDLL "$INSTDIR\Modules\aimp_menu32.dll" »
Дело в том, что Regdll вызывает в библиотеке сервера стандартную процедуру регистрации - DllRegisterServer
Однако, разработчик может сменить название процедуры регистрации, что позволяет и NSIS.
А команда UnRegDll вызывает только - DllUnregisterServer,
поэтому разрегистрацию производим тоже, через Regdll.
http://forum.oszone.net/post-1821953-2142.html
В х64 пока прокатил такой вот вариант:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMP]
@="{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMP]
@="{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}]
@="AIMP ShellExt Unit"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32]
@="D:\\AIMP3\\Modules\\aimp_menu64.dll"
"ThreadingModel"="Apartment"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved]
"{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"="AIMP ShellExt Unit"
wolkow70
26-12-2011, 10:50
поэтому разрегистрацию производим тоже, через Regdll. »
Я решил перестраховаться и все еще перед вызовом регистрации продублировал в ручную. Сработает - перезапишет. Если сбой будет - не страшно.
Section "Расширенная интеграция в контекстое меню Проводника" ContextMenu
SectionIn 1 2
SetOutPath "$INSTDIR"
WriteRegStr HKLM "SOFTWARE\Classes\Directory\shellex\ContextMenuHandlers\AIMP" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Classes\*\shellex\ContextMenuHandlers\AIMP" "" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}"
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved" "{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "AIMP ShellExt Unit"
;
${If} ${RunningX64}
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP ShellExt Unit"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "$INSTDIR\Modules\aimp_menu64.dll"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"
;
regdll "$INSTDIR\Modules\aimp_menu64.dll" ContextMenuAddonRegister
${Else}
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}" "" "AIMP ShellExt Unit"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "" "$INSTDIR\Modules\aimp_menu32.dll"
WriteRegStr HKLM "SOFTWARE\Classes\CLSID\{1F77B17B-F531-44DB-ACA4-76ABB5010A28}\InprocServer32" "ThreadingModel" "Apartment"
;
regdll "$INSTDIR\Modules\aimp_menu32.dll" ContextMenuAddonRegister
${EndIf}
SectionEnd
В удалялке тоже продублировал в ручную.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC